StrongParametersとnested_attributesではまった件
どうもどうも。
自分Rails3.2.xにStrongParametersとActionArgsをbundleして使ってるんですが、昨日たまたまそれで予期しない挙動にはまって、
\( 'ω')/ウオオオオオオアアアアーーーーッッッ!!!!
ってなったので、備忘録として残しておこうと思います。モデルとコントローラーは↓みたいな感じで。
# app/models/user.rb class User < ActiveRecord::Base has_many :global_names accepts_nested_attributes_for :global_names end # app/models/global_name.rb class GlobalName < ActiveRecord::Base belongs_to :user end # app/controllers/users_controller.rb class UsersController < ApplicationController permits :username, :first_name, :last_name, global_names: [:first_name, :last_name] def edit id @user = User.find id end def update id, user @user = User.find id if @user.update_attributes user redirect_to @user, notice: 'User was successfully updated!' else render 'edit' end end end # app/views/users/edit.html.haml %h1 Edit User = form_for @user do |f| .field = f.label :username = f.text_field :username .field = f.label :first_name = f.text_field :first_name .field = f.label :last_name = f.text_field :last_name .field = f.fields_for :global_names do |gn_field| .field = gn_field.label :first_name = gn_field.text_field :first_name .field = gn_field.label :last_name = gn_field.text_field :last_name = gn_field.hidden_field :id .actions = f.submit
さて、こいつの問題点はどこなのか。とりあえずおもむろにGlobalNameを突っ込んで更新しましょう……あれ?
\(^o^)/<フォームが増えたよ!!
ちょっと訳がわからないですね…気のせいかもしれないのでそのまま更新しましょう……えっ?
\(^o^)/<フォームが2倍になったよ!!
どういうことなの……
debuggerとかで調べても何も出て来ませんし、もちろんエラーは吐いてません。500になってないしeditがrenderされてるわけでもない。ワケがわからない!
で、ここで思い出してみましょう。これまでのRailsアプリとの違いを。そう、StrongParametersという存在を!
class UsersController < ApplicationController permits :username, :first_name, :last_name, global_names: [:first_name, :last_name] end
よく見てみるんだ。global_namesの中にidがない!!
というわけで今回はまった件はただの凡ミスでした/(^o^)\ナンテコッタイ
でもこれはまる人多そうなので気をつけてくださいね。







