0

我有兩個模型用戶和配置文件。
我想將用戶名和密碼保存在配置文件中的用戶和其他用戶配置文件詳細信息中。
現在,
用戶模型具有:在Rails3中嵌套模型

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 [:用戶] )中創建動作

那麼,出了什麼問題?我也試過把profile_attributes放在attr_accessible中,但它沒有幫助!
請幫我找出解決方案。

+1

嘗試刪除'@profile = @ user.create_profile(params [:profile])'行。你不需要它。 – 2012-08-13 06:28:25

+0

它看起來像你想要傳遞給@profile的配置文件實際上是用戶參數,因此你的用戶表單有問題 – megas 2012-08-13 06:35:13

+0

這告訴我你的視圖有問題。你的params散列應該有一個':profile_attributes'而不是':profile'鍵。批量分配失敗,因爲您沒有'profile'屬性並且無法訪問。如果您在視圖中調用fields_for,請確保將它傳遞給配置文件的模型。可能是'@profile'或'@user.profile',而不是簡單的字符串或符號。 – Joeyjoejoejr 2012-08-13 07:24:36

回答

1

首先,按照@nash的建議,您應該從create操作中刪除@profile = @user.create_profile(params[:profile])accepts_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 %> 

欲瞭解更多信息,see this old but great tutorial by Ryan Daigle

+0

使用:個人資料不顯示任何個人資料字段。問題是在創建新用戶時,它具有無法批量分配的配置文件屬性。 – usercr 2012-08-13 12:10:21

+0

基本上,如果您正確使用'accep_nested_attributes_for',您將永遠不會遇到質量分配保護問題。你真的永遠不需要在代碼中的任何地方使用'params [:profile]'。你的控制器甚至不需要知道UserProfile存在。我建議你閱讀由Ryan Daigle鏈接到的教程。 – jstr 2012-08-13 12:26:09