元気にやっていますか?
私は相変わらず、曖昧な空白とともにふらふらする毎日です。
健体壮美なあなたのことだから大丈夫だとは思いますが、
くれぐれもお体にはお気をつけください。

2009/11/19

[Rails] WARNING: Can't mass-assign these protected attributes:

「これら制限されている属性は割り当てることができません。」
ActiveRecordのattr_protectedで指定した属性は、任意の値を設定できなくなる。
本来はセキュリティ的な意味合いが強く、擬似Formからのデータ送信でDBを更新させないためなどに使用するようだが、
親子関係をAPベースで保証するのに使用できる。
【Model】
class Child < ActiveRecord::Base
attr_protected :parent_id
end
例えば以下のように子テーブルを更新する際、
親テーブルのIDをHiddenタグで仕込んでおくとWARNINGが発生し、parent_idには値を設定することができない。
【View】
<% form_for :child, :url => child_update_path do |form| %>
    <%= form.text_field :XXXX %>
    <%= form.text_field :ZZZZ %>
    <%= form.hidden_field :parent_id %>
    <%= form.submit '更新' %>
<% end %>

【Controller】
child = ChiledTable.new(params[:child])  # この時にWARNING発生、parent_idは設定できない。
child.save                        # parent_idがnilで登録される
⇒WARNING: Can't mass-assign these protected attributes: parent_id
以下の方法で登録すると、自動的にparent_idが挿入され、リレーションが保証される。
【View】
<% form_for :child, :url => child_update_path do |form| %>
    <%= form.text_field :XXXX %>
    <%= form.text_field :ZZZZ %>
    <%= form.submit '更新' %>
<% end %>

【Controller】
parent = ParentTable.find(params[:id])
child = ChiledTable.new(params[:child])
parent << child

0 件のコメント:

コメントを投稿