Rails 4.2:accepted_nested_attributes_for with build_relation,如何选择现有的OR创建新的?

时间:2015-02-11 01:54:57

标签: ruby-on-rails devise

基本上,在创建新实体时,我使用build_owner来呈现所有者的嵌套属性。但是,我希望用户可以选择现有的所有者,或者在表单中创建一个新的。

实体模型:

class Entity < ActiveRecord::Base
  belongs_to :owner
  accepts_nested_attributes_for :owner
end

所有者模型(设计模型,遗漏验证):

class Owner < ActiveRecord::Base
  has_many :entities
end

实体控制器(新方法):

def new
  @entity = Entity.new
  @entity.build_owner
end

实体视图(新方法):

<%= f.fields_for :owner do |o| %>
  <%= o.select :id, Owner.all, include_blank: 'Create a New Owner' %>
  <%= o.text_field :name %>
  <%= o.email_field :email %>
<% end %>

因此,如果用户从列表中选择所有者,则应用程序应将此所有者指定为owner_id,并忽略:name和:email字段。但是,目前该应用程序启动了一个错误:name和:email验证是否存在。

如何在创建实体记录时允许用户选择现有所有者或创建新所有者?

- 更新

通过JavaScript的强大功能,我通过给:name和:email字段:当selectbox的val为空时使用:disabled prop来完成这项工作。但是,我仍然对更多Rails-y方式感兴趣。

1 个答案:

答案 0 :(得分:0)

尝试先查找所有者是否存在,然后再进行分配。否则建立它。代码仅供参考。这是未经测试的

def new
  @entity = Entity.new
  begin
    @owner = Owner.find(params[:owner_id])
    @entity.owner = @owner
  rescue RecordNotFound => e
    @entity.build_owner
  end
end