0

ユーザーとプロファイルの 2 つのモデルがあります。
ユーザー名とパスワードをユーザーに保存し、他のユーザー プロファイルの詳細をプロファイルに保存したいと考えています。
現在、
ユーザーモデルには次のものがあります。

has_one :profile
accepts_nested_attributes_for :profile
attr_accessible :email, :password

プロファイルモデルには

 belongs_to :user
 attr_accessible :bio, :birthday, :color

ユーザーコントローラーには

 def new
    @user = User.new
    @profile = @user.build_profile
  end

  def create
    @user = User.new(params[:user])
    @profile = @user.create_profile(params[:profile])
    if @user.save
      redirect_to root_url, :notice => "user created successfully!"
    else
      render "new"
    end
  end

ビュー new.html.erb には、ユーザーとプロファイルの両方のフィールドがあります。
ただし、この Web アプリケーションを実行すると、次のエラーが表示

されます: 保護された属性を一括割り当てできません:

デバッグ時にプロファイルが作成アクション で@user = User.new(params[:user])

にスタックする ので、何が問題なのですか? :profile_attributes を attr_accessible に入れてみましたが、役に立ちません!
解決策を見つけるのを手伝ってください。

4

1 に答える 1

1

まず、@nash で提案されているように、アクション@profile = @user.create_profile(params[:profile])から削除する必要がありますcreateaccepts_nested_attributes_forが自動的にあなたのプロフィールを作成します。

ビューがネストされた属性に対して正しく設定されていることを確認してください。に何も表示されるべきではありませんparams[:profile]params[:user][:profile_attributes]ネストされたモデルが正しく機能するには、プロファイル属性が必要です。

要約すると、createアクションは次のようになります。

def create
  @user = User.new(params[:user])

  if @user.save
    redirect_to root_url, :notice => "user created successfully!"
  else
    render "new"
  end
end

フォーム ビュー (通常_form.html.erb) は次のようになります。

<%= form_for @user do |f| %>

  Email: <%= f.text_field :email %>
  Password: <%= f.password_field :password %>

  <%= f.fields_for :profile do |profile_fields| %>

    Bio: <%= profile_fields.text_field :bio %>
    Birthday: <%= profile_fields.date_select :birthday %>
    Color: <%= profile_fields.text_field :color %>

  <% end %>

  <%= f.submit "Save" %>

<% end %>

詳細については、Ryan Daigle による古いが優れたチュートリアルを参照してください

于 2012-08-13T10:53:18.867 に答える