0

Car モデルと Brand モデルがあります (それぞれ has_and_belongs_to_many)。車の新しいブランドを作ろうとしています。車のモデルは、ブランドのネストされた属性を受け入れます。

やってみると

@car = Car.find(params[:car_id])
@brand = @car.brands.build(params[:brand])

一括割り当てエラーが発生します:

Can't mass-assign protected attributes: brands

ブランド コントローラー:

class BrandsController < ApplicationController
 def create
  debugger
  @car = Car.find(params[:car_id])
  @brand= @car.brands.build(params[:brand])
  if @brand.save
   redirect_to @car
  else
   #do something
  end
 end 
end

でデバッガーを呼び出す

pp params

ショー:

"brand"=>{"brands"=>{"name"=>"BMW"}},
"commit"=>"Create Brand",
"action"=>"create",
"controller"=>"brands",
"car_id"=>"4"}

ビューは次のようになります。

<%= form_for([@car, @car.brands.build]) do |f| %>
    <div class="field">
        <%= f.fields_for :brands do |a| %>
            <%= a.text_field :name, placeholder: "New Brand" %>
        <% end %>
    </div>
    <p><%= f.submit %></p>
<% end %>

アプリケーションを安全にしたいので、「ブランド」ハッシュ全体を渡すのではなく、ブランド属性を個別に設定したいと考えています (ちなみにこれは機能しません)。ブランド名を取得するにはどうすればよいですか?何かのようなもの

params[:brands].name?

編集:

「params[:brand][:brands][:name]」でブランド名を取得できます。結合テーブルで車に接続されているため、brands テーブルには car_id がないことがわかりました。

4

2 に答える 2

1

モデルが別のモデルの属性を受け入れるようにすることは、場合によっては便利なツールですが、モデル レベルだけでなく、コントローラーとビュー レイヤーでも単一責任の原則に違反し、面倒になる傾向があります。最終的に、設計を変更する必要がある場合のリファクタリングがより困難になります。

自動車を通じてブランドを作成する代わりに、REST の哲学に従い、BrandsController を使用してブランドのライフサイクルを処理します。

セキュリティの要件に関しては、モデルの属性を手動で設定しても、それ以上のセキュリティは提供されず、attr_accessible を適切に使用していると仮定して、params ハッシュ全体を渡します。受け入れ可能なパラメーターのホワイトリストを与えると、AR インターフェースに他のすべてを拒否するように指示します。

class Brand < ActiveRecord::Base
  attr_accessible :name
end

したがって、ブランドが車に属しており、誰かが car_id をハッキングして関係を変更しようとすると、ハッシュから car_id が拒否され、設定によっては例外が発生することさえあります。

config.active_record.mass_assignment_sanitizer = :strict

これによりActiveModel::MassAssignmentSecurity::Error、ログに出力される警告だけでなく、

于 2013-02-15T16:31:57.550 に答える
1
<%= form_for @car do |f| %>
  <div class="field">
    <%= f.fields_for :brands do |a| %>
        <%= a.text_field :name, placeholder: "New Brand" %>
    <% end %>
  </div>
<p><%= f.submit %></p>
<% end %>

あなたのモデルでは:

class Car < ActiveRecord::Base
  has_many :brands
  accepts_nested_attributes_for :brands
  attr_accessible :brand_attributes
end
于 2013-02-15T15:46:20.280 に答える