0

検証: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

モデル (販売) の作成時に検証できるようにする必要があります。関連付け (製品) の場合、stock_number という product.column でゼロに達していません。

全体を書き直す必要があると思いますが、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

これは、producto から en_stock 列を減らす私のオブザーバーです。

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
4

2 に答える 2

4

ここで多くのことが間違っているようです。

まず第一に、あなたはあまりにも多くの仕事をしています。本当に必要なのはこれだけです。

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 を使用しました。

第三に、ある時点で product.stocknumber を減らしているようです。おそらく before_validation としてなので、save 呼び出しの前に product.stocknumber が 0 だった場合、チェック中に product.stocknumber が 0 未満である可能性が高くなります。

それを反映するように if 条件を変更しましょう。

unless product.stocknumber > 0

最後に、before_save コールバックを使用しているため、エラーを追加するだけではトランザクションはキャンセルされません。トランザクションをキャンセルするには、前/後の保存/作成/更新/valdiaiton コールバックに対して false を返す必要があります。

これをすべてまとめると、

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 を介して 2 つを簡単に区別できるため、フラッシュ ハッシュでエラーを渡すことに関しては、通知よりもエラーを好みます。また、flash[:errors] を赤いテキストを与えるクラスで常に表示する方が DRY です。flash[:notice] の内容がエラーか通知かを判断するロジックをビューに書き込みます。

于 2009-11-18T04:46:08.500 に答える
2

このモデルではフラッシュは使用できません。次のようなことをする必要があります:

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

次に、コントローラーとビューでフラッシュを操作します。

于 2009-11-18T02:20:11.037 に答える