2014-03-03 120 views
0

我有一個簡單的模型,User,通過Rails(version 4.0.2)的Devise(version 3.0.4)gem生成。我還製作了一個名爲Profile的非設計模型。配置文件有兩個字符串屬性,namebio。每個用戶has_one配置文件,以及每個用戶配置文件belongs_to。我試圖讓用戶註冊表單包含配置文件屬性,因此新用戶表單中嵌套的配置文件表單。我的表單設置正確,並且所有用戶和配置文件屬性都已正確傳遞到:params似乎一切正常,除了配置文件,它的屬性不保存到數據庫。日誌顯示:profile對用戶爲零。 我做了很多研究,我覺得我已經嘗試了一切,所以我希望有人能夠解決這個問題。下面的代碼:Rails設計模型不是以嵌套形式保存模型?

用戶模式:

class User < ActiveRecord::Base 

    has_one :profile, dependent: :destroy, :autosave => true 
    accepts_nested_attributes_for :profile 

    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 

end 

剖面模型:

class Profile < ActiveRecord::Base 

    belongs_to :user, :autosave => true 
    validates :user_id, presence:true 

end 

註冊記憶控制器:

class RegistrationsController < Devise::RegistrationsController 


    def new 
     resource = build_resource({}) 
     resource.build_profile 
     respond_with resource 

    end 



end 

新用戶的形式,views/devise/registrations/new.html.erb

<h2>Sign up</h2> 


<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> 
    <%= devise_error_messages! %> 

    <div><%= f.label :email %><br /> 
    <%= f.email_field :email, :autofocus => true %></div> 

    <div><%= f.label :password %><br /> 
    <%= f.password_field :password %></div> 

    <div><%= f.label :password_confirmation %><br /> 
    <%= f.password_field :password_confirmation %></div> 


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

     <h2><%= builder.label :bio%></h2> 
     <p><%= builder.text_field :bio %></p> 

     <h2><%= builder.label :name %></h2> 
     <p><%= builder.text_field :name %></p> 
    <% end %> 


    <div><%= f.submit "Sign up" %></div> 
<% end %> 

我沒有在配置控制器東西,除了像「新」空現有的方法。

+0

你沒有你強的參數在應用程序控制器設置, 你做? – JustBasti

回答

0

更新不滿意答:

由於設計使用強大的PARAMS事實上,你無法通過sign_up_params通過額外的非用戶PARAMS。你可以做兩件事之一。或者將名稱&生物字段添加到用戶模型並使用設計表單一次性保存它們。或者在註冊時創建一個空白配置文件,然後讓用戶通過單獨的表單輸入生物和姓名,您可以將其保存到配置文件模型。我希望有所幫助。

設計表單提供由Create收集和處理的註冊參數。 請參閱完整的設計控制器:https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb

在您的表單中,您還生成了兩個附加參數:bio和:name。但是,除了內置註冊之外,您還需要捕獲和處理這些參數並生成/保存新的配置文件。

你可以這樣做來修改devise create方法來保存你的配置文件後,新用戶已被創建。

# POST /resource 
def create 
build_resource(sign_up_params) 

if resource.save 
    @profile = current_user.profile.build(bio: params[:bio], name: params[:name]) 
    @profile.save 

    yield resource if block_given? 
    if resource.active_for_authentication? 
    set_flash_message :notice, :signed_up if is_flashing_format? 
    sign_up(resource_name, resource) 
    respond_with resource, location: after_sign_up_path_for(resource) 
    else 
    set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format? 
    expire_data_after_sign_in! 
    respond_with resource, location: after_inactive_sign_up_path_for(resource) 
    end 
else 
    clean_up_passwords resource 
    respond_with resource 
end 

我認爲建立新的檔案應該在那裏工作,但它可能沒有實例化CURRENT_USER,但。(確認CURRENT_USER不可用)

編輯 - 試試這個 - 沒有工作

def create 
super 
    profile = resource.profile.build(bio: params[:bio], name: params[:name]) 
    profile.save 
end 

(來源:Rails, Devise: current_user is nil when overriding RegistrationsController

+0

看來current_user實際上還沒有實例化。我得到錯誤:「nil:NilClass」的未定義方法'配置文件「。有關如何在實例化後執行此操作的任何想法? – Joe

+0

看到上面的編輯,我希望能解決問題。 – chrisfin

+0

您的編輯確實解決了current_user爲零的問題,但後來發現配置文件爲零的錯誤。我想把它設置爲一個構建的配置文件會更有意義,然後嘗試調用一個無對象的'構建'方法。所以不是'profile = resource.profile.build(bio:params [:bio],name:params [:name])''我有'resource.profile = Profile.new(bio:params [:bio] params [:name])',然後保存。還必須用'new'替換'build'。這似乎工作,配置文件不是零!現在只是屬性:生物和:名稱是零... – Joe