【问题标题】:Using accepts_nested_attributes_for with a belongs_to association, and using find_or_create_by_attr behaviour将accepts_nested_attributes_for 与belongs_to 关联一起使用,并使用find_or_create_by_attr 行为
【发布时间】:2010-06-03 22:29:15
【问题描述】:

我正在构建一个 Rails 应用程序,它允许用户创建一个引用多个其他模型的对象,如果它们不存在则创建它们,并且只关联到已经存在的模型:

# app/models/upload.rb
class Upload < AR:B
  belongs_to :user
  belongs_to :observed_property
  belongs_to :sensor

  accepts_nested_attributes_for :observed_property, :sensor
  validates_presence_of :observed_property, :sensor
end

(sensor 和observed_property 的关联只是单向的,没有has_many 返回。)

Controller 没有什么特别之处,只是一个标准的 RESTful 7,我认为可以在将大部分逻辑保留在 Model 中的同时正确执行此操作。

我没有让用户填写多个不同的表单,然后分别引用这些对象,而是尝试使用accepts_nested_attributes_for 将它们嵌入到Upload 表单中,使用fields_for

# app/views/uploads/new.html.erb
<% form_for @upload, :url => user_uploads_path(@user) do |f| %>
  <%= f.error_messages %>
  <% f.fields_for :observed_property do |builder| %>
  <fieldset>
  <legend>Observed Property</legend>
  <p><%= builder.label :_id, "Observed Property ID" %><br />
  <%= builder.text_field :_id %></p>

  <p><%= builder.label :description %><br />
  <%= builder.text_area :description, :rows => 5 %></p>
  </fieldset>
  <% end %>
  <% f.fields_for :sensor do |builder| %>
  <fieldset>
  <legend>Sensor</legend>
  <p><%= builder.label :_id, "Sensor ID" %><br />
  <%= builder.text_field :_id %></p>

  <p><%= builder.label :description %><br />
  <%= builder.text_area :description, :rows => 5 %></p>
  </fieldset>
  <% end %>
  <%= f.submit "Submit", :class => "button" %>
<% end %>

但这不起作用,因为fields_for 没有显示任何表单。我尝试应用 this answer 中提到的内容,但模型无法保存,理由是缺少关联。

我尝试了一些骇人听闻的事情,例如覆盖 sensor=observed_property= 方法并缓存 before_save 的哈希值,但这并不是真正的正确做法。

【问题讨论】:

    标签: ruby-on-rails belongs-to fields-for


    【解决方案1】:

    我最终使用了以下解决方案,它似乎确实有效。我创建了一个要点来保存具有匹配规范的解决方案,以定义我正在寻求的行为。

    http://gist.github.com/437939

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    相关资源
    最近更新 更多