0

現在、保存する前にコントローラーのパラメーターからいくつかのフィールドを削除する必要があるフォームがあります (フィールドの列はなく、リンクされた選択を入力するためにのみ使用されます)。

問題は次のとおりです。フィールドを削除する前に、送信してはならないフィールドに対して一括割り当てエラーが発生します。コントローラーが到達したときにのみエラーが発生することを理解していました@sale = Sale.new(params[:sale])が、それより前に発生しているようです(以下のコントローラーの最初に行を配置しましたが、puts "sale params: " + params[:sale].to_s発生せず、質量割り当てエラーのみが発生します.

私のコントローラー作成アクションコードは次のようになります。

def create
  puts "sale params: " + params[:sale].to_s
  params[:sale] = params[:sale].except([:vehicles_attributes])
  @sale = Sale.new(params[:sale])
  if @sale.save
    redirect_to @sale, :notice => "Successfully created address."
  else
    render :action => 'new'
  end
end

一括割り当てエラーが発生する前に、:vehicles_attributes ハッシュが params から確実に削除されるようにするにはどうすればよいですか?

編集: 要求どおりの完全なエラー:

ActiveModel::MassAssignmentSecurity::Error in SalesController#create

Can't mass-assign protected attributes: make, model

Request
Parameters:
{"utf8"=>"✓",
"authenticity_token"=>"LX/uEp5o9smc3sCcjQbOXQQgaK2wihvS0OPZTdNOj6w=",
"sale"=>{
  "sale_type_id"=>"1",
  "date"=>"",
    "customer_attributes"=>{
      "customer_type_id"=>"1",
      "emails_attributes"=>{
        "0"=>{
          "value"=>""}}},
    "vehicles_attributes"=>{
       "0"=>{
         "make"=>"4",
         "model"=>"38",
         "trim_id"=>"658",
         "model_year_id"=>"12"
}}}}

Make と Model は、実行中に削除しようとしている属性ですparams[:sale] = params[:sale].except([:vehicles_attributes])(エラーからわかるように、これらは :vehicles_attributes ハッシュにあります)。

4

3 に答える 3

1

create多くの調査の結果、 Cancan gem によってメソッドがオーバーライドされていたため、エラーが発生する前にハッシュからパラメーターを削除できなかったことが判明しました( load_and_authorize_resources.

Frederick Cheung のコードを使用する場合、これを削除すると問題が解決しました。

于 2012-09-01T21:07:34.723 に答える
1

一括割り当ては、save の呼び出し内で発生します。ここでの問題は、except適切に使用していないことです。キーの配列を渡しています

{:a => :b}.except([:a])
#=> {:a => :b}

しかし、個々のパラメータとしてキーを期待しています

{:a => :b}.except(:a)
#=> {}
于 2012-09-01T13:17:14.350 に答える
0

あなたが求めていることは可能だと思います。試してみてください:

make = params[:sale].delete :make
model = params[:sale].delete :model
于 2012-12-13T02:52:21.597 に答える