2012-03-20 44 views
2

我有以下帳戶模式:使用has_one和條件來查找相關對象,但是如何創建相關對象?

has_one :primary_user, :class_name => "User", :conditions => "role = 'primary_user'" 

所以@ account.primary_user查找與primary_user的角色的用戶。

創建新帳戶時,我希望能夠創建一個新的primary_user。什麼是「Rails方式」來做到這一點?

我需要創建一個primary_user =方法?

這裏是我創建的形式..

<%= semantic_form_for @account do |f| %> 
    <%= f.input :account_name %> 

    <%= f.semantic_fields_for :primary_user do |user| %> 
     <%= user.input :email %> 
    <% end %> 
<% end %> 

如果我提交此表,我得到

預計

的ActiveRecord :: AssociationTypeMismatch(用戶(#2159789500),得到的ActiveSupport :: HashWithIndifferentAccess(#2159703820) ):

感謝

回答

2

少許清潔劑:

has_one :primary_user, :class_name => "User", :conditions => { :role => "primary_user" } 

然後直解:

<%= semantic_form_for @account do |f| %> 
    <%= f.input :account_name %> 

    <%= f.semantic_fields_for :primary_user, primary_user || build_primary_user do |user| %> 
     <%= user.input :email %> 
    <% end %> 
<% end %> 

但我建議你向控制器添加到新的行動這

@account.build_primary_user 
+0

我不確定這會爲用戶添加角色「primary_user」,會嗎? – 2012-03-20 15:04:01

+0

從它提交後會。或者你需要添加用戶befor提交? – fl00r 2012-03-20 15:05:17

+0

@Batkins'@ account.build_primary_user' – fl00r 2012-03-20 15:08:33

0

這建立在什麼@ fl00r在他的帖子中寫道:頂...我同意適當的地方使對象在控制器中生成。在您AccountsControllernew動作,你只需要添加一行:

@account.primary_user ||= @account.build_primary_user

所以你new行動將是這個樣子(加上額外的東西你加):

def new 
    @account = Account.new 
    @account.primary_user ||= @account.build_primary_user 
end 

然後,您的創建表單的代碼應該按原樣運行。