どうもどうも。
自分Rails3.2.xにStrongParametersとActionArgsをbundleして使ってるんですが、昨日たまたまそれで予期しない挙動にはまって、
\( ‘ω’)/ウオオオオオオアアアアーーーーッッッ!!!!
ってなったので、備忘録として残しておこうと思います。
こういうRailsアプリを書きました
モデルとコントローラーは↓みたいな感じで。
user.rb
class User < ActiveRecord::Base
has_many :global_names
accepts_nested_attributes_for :global_names
end
global_name.rb
class GlobalName < ActiveRecord::Base
belongs_to :user
end
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
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という存在を!
users_controller.rb
class UsersController < ApplicationController
permits :username, :first_name, :last_name, global_names: [:first_name, :last_name]
end
よく見てみるんだ。global_namesの中にidがない!!
というわけで
今回はまった件はただの凡ミスでした/(^o^)\ナンテコッタイ
でもこれはまる人多そうなので気をつけてくださいね。