7

強力なパラメーターを使用しないコントローラーにコードがあったとしましょう

Model.create name: params[:name], alias_id: params[:foreign_id]

ここで強力なパラメータを使用することはできますか?

できない

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

なぜならforeign_idはパラメータではないからです

できない

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

alias_idがモデルにないためです。

基本的に、StrongParametersを使用するときにパラメーターキーをエイリアスできるかどうかを知りたいです。

4

2 に答える 2

18

通常、この方法でパラメーターをマップしたい場合(通常は外部APIが原因)、次のalias_attributeメソッドを使用します。ActiveRecord

だから私が私に来るパラメータを持っているなら、{name: "bob", alias_id: 1234}そして理想的には私は持っていたいでしょう{name: "bob", foreign_id: 1234}

私のActiveRecordモデルで次のことを宣言します

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

これで、モデルは常に任意のコンテキストへのalias_idマッピングとして認識され、プッシュインできます。モデルはそれを認識し、コントローラーの属性をループすることなく、必要に応じて処理します。foreign_idparams.require(:name, :alias_id)

他のモデルでも同様に実行したい場合は、これも簡単です。

于 2016-06-22T13:28:44.040 に答える
3

次のコードで必要な機能を取得しました。特にrequire()は複数のパラメーターをとることができないため、StrongParametersが必要なことを実行できるとは思いません。

これを私の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})
于 2013-03-15T06:56:24.083 に答える