LoginSignup
15
15

More than 5 years have passed since last update.

StrongParametersとnested_attributesではまった件

Last updated at Posted at 2013-02-21

どうもどうも。

自分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^)\ナンテコッタイ

でもこれはまる人多そうなので気をつけてくださいね。

15
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15