将参数传递给Rails中的ruby方法

时间:2015-06-09 05:03:17

标签: ruby-on-rails ruby ruby-on-rails-4

我在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;
&#13;
&#13;

我在某个控制器中我想像这样调用这个方法:

&#13;
&#13;
set_cartridge_values(@cartridge, ? ,params[:toner_kg][:weight])
&#13;
&#13;
&#13;

取代? mark我不知道如何传递该参数。

@cartridge - 是之前定义的变量

params [:toner_kg] [:weight] - 是一个值

和cartridge_value - 是盒式磁带的属性。

例如,我想传递墨盒模型的toner_gr属性并更新该属性。

2 个答案:

答案 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)