[解決済み] ネストされた属性の未許可パラメータ
質問
私は
Bill
オブジェクトがあり、これには多くの
Due
オブジェクトがあります。その
Due
オブジェクトもまた
Person
. を作成できるフォームが欲しい。
Bill
とその子である
Dues
をすべて1つのページで使用することができます。のような、入れ子になった属性を使ってフォームを作成しようとしています。
このレールキャスト
.
関連するコードを以下に示します。
due.rb
class Due < ActiveRecord::Base
belongs_to :person
belongs_to :bill
end
bill.rb
class Bill < ActiveRecord::Base
has_many :dues, :dependent => :destroy
accepts_nested_attributes_for :dues, :allow_destroy => true
end
bills_controller.rb
# GET /bills/new
def new
@bill = Bill.new
3.times { @bill.dues.build }
end
bills/_form.html.erb
<%= form_for(@bill) do |f| %>
<div class="field">
<%= f.label :company %><br />
<%= f.text_field :company %>
</div>
<div class="field">
<%= f.label :month %><br />
<%= f.text_field :month %>
</div>
<div class="field">
<%= f.label :year %><br />
<%= f.number_field :year %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<%= f.fields_for :dues do |builder| %>
<%= render 'due_fields', :f => builder %>
<% end %>
<% end %>
bills/_due_fields.html.erb
<div>
<%= f.label :amount, "Amount" %>
<%= f.text_field :amount %>
<br>
<%= f.label :person_id, "Renter" %>
<%= f.text_field :person_id %>
</div>
bills_controller.rbにUPDATE。 これは動作します!
def bill_params
params
.require(:bill)
.permit(:company, :month, :year, dues_attributes: [:amount, :person_id])
end
適切なフィールドがページ上にレンダリングされます。
Person
のドロップダウンはまだありません)、そして投稿は成功します。しかし、子会費はどれもデータベースに保存されず、サーバーログにエラーがスローされます。
Unpermitted parameters: dues_attributes
エラーの直前、ログにはこのように表示されます。
Started POST "/bills" for 127.0.0.1 at 2013-04-10 00:16:37 -0700
Processing by BillsController#create as HTML<br>
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"ipxBOLOjx68fwvfmsMG3FecV/q/hPqUHsluBCPN2BeU=",
"bill"=>{"company"=>"Comcast", "month"=>"April ",
"year"=>"2013", "dues_attributes"=>{
"0"=>{"amount"=>"30", "person_id"=>"1"},
"1"=>{"amount"=>"30", "person_id"=>"2"},
"2"=>{"amount"=>"30", "person_id"=>"3"}}}, "commit"=>"Create Bill"}
Rails 4で何か変更があったのでしょうか?
どのように解決するのですか?
属性保護の扱いに変更があったようで、以前はオプションだったgem strong_parametersがRails Coreの一部になったため、(モデルでattr_accessibleの代わりに)コントローラでパラメータをホワイトリスト化する必要があるようです。
これは次のような感じです。
class PeopleController < ActionController::Base
def create
Person.create(person_params)
end
private
def person_params
params.require(:person).permit(:name, :age)
end
end
そこで
params.require(:model).permit(:fields)
が使われることになります。
で、ネストされた属性には
params.require(:person).permit(:name, :age, pets_attributes: [:id, :name, :category])
さらに詳しい情報は Ruby エッジ API ドキュメント と strong_parametersはgithubにあります。 または ここで
関連
-
[解決済み】bundle installが "Could not locate Gemfile "を返す。
-
[解決済み] 該当するルートがない [GET] "demo/hello"
-
[解決済み] erbでコメントを追加する最適な方法
-
[解決済み] PG::ConnectionBad - サーバーに接続できませんでした。接続が拒否されました。
-
[解決済み] nil:NilClass の未定義メソッド `each' - しかし、なぜ?
-
[解決済み] RVMでRubyのデフォルトバージョンを設定するには?
-
[解決済み] gemのアップデート後、"Asset was not declared to be precompiled in production "でテストが失敗する。
-
[解決済み] Railsコントローラからホスト名を取得する
-
[解決済み] rspecにおけるassignsの意味
-
[解決済み] RSpecとCucumberの違いは何ですか?[クローズド]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ActionController::InvalidAuthenticityTokenについて
-
[解決済み] pg gem をインストールしようとすると 'libpq-fe.h' ヘッダが見つからない
-
[解決済み] Ruby/Rails の「フック」とは何ですか?
-
[解決済み] gemのインストールができない - gemネイティブ拡張の構築に失敗 - そのようなファイルをロードできない -- mkmf (LoadError)
-
[解決済み] 新規ユーザー作成時に ActiveModel::ForbiddenAttributesError が発生する。
-
[解決済み] Ruby on Railsのランナー
-
[解決済み] Rails のインストールに失敗する: activesupport には Ruby のバージョン >= 2.2.2 が必要です。
-
[解決済み] Ruby on rails "No route matches" (ルートに一致するものがない)。
-
[解決済み] Railsマイグレーションを利用してカラムをドロップする方法
-
[解決済み] railsアプリケーションでCookieのオーバーフロー?