3

可以說,我在沒有使用強參數有沒有辦法重命名強參數鍵?

控制器有代碼
Model.create name: params[:name], alias_id: params[:foreign_id] 

是否有可能對我來說,這裏使用強參數?

我不能做

Model.create params.require(:name, :foreign_id) 

因爲foreign_id不是PARAM

我不能做

Model.create params.require(:name, :alias_id) 

因爲alias_id不是在模型上。

基本上,我想知道在使用強參數時是否可以輸入參數鍵。

回答

5

通常如果我想用這種方式映射PARAMS(通常是由於某些外部API )我使用alias_attribute方法ActiveRecord

所以,如果我有params來到我這裏作爲{name: "bob", alias_id: 1234}和理想情況下,我窩ULD希望有{name: "bob", foreign_id: 1234}

我宣佈我ActiveRecord模型

class MyModel < ActiveRecord::Base 
    alias_attribute :alias_id, :foreign_id 
end 

下現在我的模型將永遠意識到alias_id作爲映射foreign_id在任何情況下,我可以在params.require(:name, :alias_id)推,我的模型將其識別並根據需要處理它,而不會循環控制器中的屬性。

如果你想在其他型號上做到這一點,這也更簡單。

+1

TIL。感謝您的洞察力! – 2016-06-23 06:54:38

1

我用下面的一段代碼得到了我想要的功能。我不認爲Strong參數可以做我需要的東西,特別是因爲require()不能帶多個參數。

通過把這個在我的ApplicationController或模塊,它繼承

# 
# Pass in a list of param keys to pull out of the params object 
# Alias param keys to another key by specifiying a mapping with a Hash 
# eg. filter_params :foo, :bar, {:choo => :zoo} 
# 
def filter_params(*param_list) 
    filtered_params = {} 
    param_list.each do |param| 
    if param.is_a? Hash 
     param.each {|key, value| filtered_params[value] = params[key]} 
    else 
     filtered_params[param] = params[param] 
    end 
    end 
    filtered_params 
end 

我現在可以說

Model.create filter_params(:name, {foreign_id: :alias_id}) 
相關問題