我在AplicationController中有方法,我想从所有控制器中重用:
class AplicationController < ActionController::Base
protected
def set_cartridge_values(cartridge, cartridge_value, param_value)
@quantity = cartridge.cartridge_value.to_i + param_value.to_i
cartridge.update(cartridge_value: @quantity)
end
&#13;
我在某个控制器中我想像这样调用这个方法:
set_cartridge_values(@cartridge, ? ,params[:toner_kg][:weight])
&#13;
取代? mark我不知道如何传递该参数。
@cartridge - 是之前定义的变量
params [:toner_kg] [:weight] - 是一个值
和cartridge_value - 是盒式磁带的属性。
例如,我想传递墨盒模型的toner_gr属性并更新该属性。
答案 0 :(得分:1)
我认为以下内容适合您:
def set_cartridge_values(cartridge, attribute, value)
@quantity = cartridge.send(cartridge_attribute).to_i + value.to_i
cartridge.update(cartridge_value => quantity)
end
你称这种方法如下:
set_cartridge_values(@cartridge, :toner_gr, params[:toner_kg][:weight])
或者你可以使用increment!
什么使得如此短暂,以至于不需要额外的方法:
@cartridge.increment!(:toner_gr, params[:toner_kg][:weight].to_i)
答案 1 :(得分:1)
您可以使用
而不是send
def set_cartridge_values(cartridge, cartridge_attribute, value)
@quantity = cartridge[cartridge_attribute].to_i + value.to_i
cartridge.update(cartridge_value => quantity)
end
另一种选择是使用read_attribute
@quantity = cartridge.read_attribute(cartridge_attribute).to_i + value.to_i
如果只应访问实例的公共方法,则应使用public_send
。
@quantity = cartridge.public_send(cartridge_attribute).to_i + value.to_i
所以可能的选择是,
cartridge[cartridge_attribute]
cartridge.read_attribute(cartridge_attribute)
cartridge.public_send(cartridge_attribute)
cartridge.send(cartridge_attribute)