2012-03-20 40 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 

然后,您的创建表单的代码应该按原样运行。