2015-06-09 4 views
0

у меня есть метод внутри AplicationController, которые я хочу быть многоразовыми из всех контроллеров:Передача параметров Рубин методов в Rails

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

Я в каком-то контроллере я хочу кал этого метода, как, что :

set_cartridge_values(@cartridge, ? ,params[:toner_kg][:weight])

Вместо? mark Я не знаю, как передать этот параметр.

@cartridge - это определено выше Название переменной

Params [: toner_kg] [: вес] - это значение

и cartridge_value - это атрибут патрона.

Например, я хочу передать атрибут toner_gr модели картриджа и обновить этот атрибут.

ответ

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) 
+0

спасибо, совершенен. – yerassyl

+0

не является приращением устаревшим? – yerassyl

+0

Почему вы так думаете? – spickermann

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)