不幸的是这个混乱有效:你有没有建议清理这段代码:我正在尝试使用activerecord比较两个表列,“needed”和“amount”然后更新一个布尔列,具体取决于返回的数据。完全打破了不重复编码。
def update
@inventory = Inventory.find(params[:id])
respond_to do |format|
if @inventory.update_attributes(params[:inventory])
unless @inventory.needed.nil?
if @inventory.needed < @inventory.amount then
@inventory.instock = true
@inventory.update_attributes(params[:inventory])
else
@inventory.instock = false
@inventory.update_attributes(params[:inventory])
end
end
flash[:notice] = 'Inventory was successfully updated.'
format.html { redirect_to(@inventory) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @inventory.errors, :status => :unprocessable_entity }
end
end
end
干杯!
答案 0 :(得分:3)
首先,将无关逻辑保留在控制器之外:
def update
@inventory = Inventory.find(params[:id])
respond_to do |format|
if @inventory.update_attributes(params[:inventory])
flash[:notice] = 'Inventory was successfully updated.'
format.html { redirect_to(@inventory) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @inventory.errors, :status => :unprocessable_entity }
end
end
end
然后,使用Inventory模型上的回调处理instock属性。类似的东西:
before_update :check_instock, :unless => Proc.new { |inventory| inventory.needed.nil? }
def check_instock
if needed < amount
instock = true
else
instock = false
end
end
答案 1 :(得分:0)
您对@inventory.update_attributes
的多次调用非常困惑。只应在将记录保存到数据库时调用一次。您应该使用@inventory.attributes = params[:inventory]
并使用if @inventory.save
来访问数据库。
也许像(未经测试):
@inventory.attributes = params[:inventory]
unless @inventory.needed.nil?
@inventory.instock = (@inventory.needed < @inventory.amount) ? true : false
@inventory.save
end