Требуется помощь в проверке - PullRequest
0 голосов
/ 18 ноября 2009

проверить: check_product_stock

def check_product_stock

  @thisproduct = product.id

   @productbeingchecked = Product.find_by_id(@thisproduct)

   @stocknumber = @productbeingchecked.stock_number

  if producto.en_stock == 0
   raise "El Producto no tiene stock suficiente para completar la venta"

   #errors.add :venta, "Producto con pedos de stock"
   return false
  end
true
end

end

мне нужно иметь возможность проверить при создании модели (продажи), если ее ассоциация (продукт) не достигла нуля в столбце product.column с именем stock_number.

я думаю, что мне нужно переписать все это, но теперь с помощью validate: check_product_stock затем с нуля создал метод, который проверяет, не достиг ли продукт нулевого значения и имеет ли он флэш-уведомление и остается на том же месте ( продажи / новый)

class Venta < ActiveRecord::Base

  hobo_model # Don't put anything above this

  belongs_to :cliente, :accessible => true
  belongs_to :producto, :accessible => true
  belongs_to :marca, :accessible => true
  belongs_to :vendedor
  belongs_to :instalador
  has_many :devolucions



  fields do
    numero_de_serie     :string
    precio_de_venta      :integer
    precio_de_instalacion :integer, :default => "0"
    forma_de_pago enum_string(:contado, :tarjeta)
    status enum_string(:activa, :cancelada)
    timestamps
  end

  validates_presence_of :cliente, :precio_de_venta, :vendedor, :precio_de_instalacion

  validate_on_create :check_product_stock

  after_save :descontar_precio_de_instalacion_si_el_instalador_es_a_destajo

#def stock_error

  #flash[:notice] = "Producto con pedos de stock"

#  redirect_to :controller => :venta, :action => :stock_error

     #errors.add_to_base("Producto con pedos de stock") 

 # end

def check_product_stock

if producto.en_stock == 0
 raise "El Producto no tiene stock suficiente para completar la venta"

 #errors.add :venta, "Producto con pedos de stock"
   return false
  end
true
end

#def check_product_stock
#  if producto.en_stock == 0
 #  errors.add :producto, "El Producto no tiene stock suficiente para completar la venta"
 #  return false
#  end
#  true # guards against returning nil which is interpreted as false.
#end




def descontar_precio_de_instalacion_si_el_instalador_es_a_destajo





  @este_instalador_id = instalador.id

  @instalador = Instalador.find_by_id(@este_instalador_id)


  if @instalador.a_destajo?

    @last_venta = Venta.find(:last)

    @vid = @last_venta.id

    @precio_de_instalacion_original = precio_de_instalacion

    @mitad_de_instalacion = @precio_de_instalacion_original/2

    #Venta.update(@vid, :precio_de_instalacion => @mitad_de_instalacion)

    ActiveRecord::Base.connection.execute "UPDATE ventas SET precio_de_instalacion = #{@mitad_de_instalacion} WHERE id = #{@vid};"



  end


end








#after_save :reduce_product_stock_number

# def reduce_product_stock_number
 #  Producto.decrement_counter(:en_stock, producto.id)
#  end




  # --- Permissions --- #

  def create_permitted?
    true
  end

  def update_permitted?
    false
  end

  def destroy_permitted?
    false
  end

  def view_permitted?(field)
    true
  end

end

И это мой наблюдатель, который уменьшает столбец en_stock от producto:

class VentaObserver < ActiveRecord::Observer

def after_save(venta)

      @venta_as_array = venta




      if venta.producto_id?

      @pid = @venta_as_array[:producto_id]

      Producto.decrement_counter(:en_stock, @pid)

      end

      if venta.cart_id

        @cid = @venta_as_array[:cart_id] 

        @cart = Cart.find_by_id(@cid)  

        for item in @cart.cart_items do
         #  @pid = @cart.cart_items.producto.id



             Producto.decrement_counter(:en_stock, item.producto.id)

        end

        #si el instalador es a destajo se debe descontar la mitad del rpecio de instalacion






        end

end

end

Ответы [ 2 ]

4 голосов
/ 18 ноября 2009

Кажется, у вас здесь много проблем.

Прежде всего, вы делаете слишком много работы. Это все, что вам действительно нужно.

before_save :check_product_stock

def check_product_stock
  if product.stocknumber == 0
   flash[:notice] = "Producto con pedos de stock"
  end
end

Во-вторых, флэш-хэш недоступен в моделях. Вы можете использовать объект ошибки ActiveRecord, чтобы сделать ошибки доступными для контроллера и представлений, заменив

flash[:notice] = с errors.add_to_base

Я использовал errors.add_to_base, потому что ошибка не является частью этой модели, но все еще блокирует сохранение.

В-третьих, кажется, что в какой-то момент вы уменьшаете количество продукта. Вероятно, как before_validation, поэтому весьма вероятно, что product.stocknumber будет меньше 0 во время проверки, если product.stocknumber был 0 перед вызовом сохранения.

Итак, давайте изменим условие if, чтобы отразить это.

unless product.stocknumber > 0

Наконец, вы используете обратный вызов before_save, поэтому простое добавление ошибки не отменит транзакцию. Вы должны вернуть false для обратного вызова save / create / update / valdiaiton до / после, чтобы отменить транзакцию.

Соединение всего этого дает вам

before_save :check_product_stock

def check_product_stock
  unless product.stocknumber > 0
   errors.add_to_base "Producto con pedos de stock"
   return false
  end
  true # guards against returning nil which is interpreted as false.
end

Что касается отображения этих ошибок, вы можете использовать симпатичный помощник error_messages_for для объекта в представлении. Или скопируйте ошибки во флэш-хэш в контроллере.

По виду:

<%= error_mesages_for :order %>

Или в контроллере в блоке else if @order.save:

 flash[:errors] = @order.errors.full_messages.join "<br />"

Я предпочитаю ошибки, а не уведомления, когда речь идет о передаче ошибок во флэш-хэш, потому что это облегчает их различение с помощью CSS, если какое-либо действие приводит к появлению как уведомлений, так и ошибок. Также более СУХОЙ всегда отображать flash [: errors] с классом, который дает красный текст, напишите логику в своем представлении, чтобы определить, является ли содержимое flash [: уведомлением] ошибкой или уведомлением.

2 голосов
/ 18 ноября 2009

вспышка недоступна в модели. Вам нужно сделать что-то вроде этого:

errors.add :stocknumber, "Producto con pedos de stock"

А потом работать со вспышкой в ​​контроллере и просмотрах.

...