我建立一個Rails應用程序,它允許用戶創建引用多個其他車型的對象,創建它們,如果它們不存在,只是關聯到那些已經存在:使用accepts_nested_attributes_for有belongs_to的關聯,並使用find_or_create_by_attr行爲
# 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
(該協會傳感器和observed_property只是單向的,不存在的has_many返回。)
的控制器是沒有什麼特別的,只是一個標準的REST風格的七,我會認爲這在保持模型中大部分邏輯的同時可以正確地做到這一點。
代替具有用戶填寫多種不同的形式並且然後分別引用這些目的,我試圖使用accepts_nested_attributes_for
將它們嵌入到使用fields_for
的Upload
形式:
# 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提到,但該模型也只是無法保存,理由是缺少關聯。
我已經嘗試了幾hackish的東西,如重寫sensor=
和observed_property=
方法和緩存哈希爲before_save
,但並不覺得自己真的要做事的正確方法。
我已經更新爲Rails 4要點:https://gist.github.com/dmzza/ce9b6e660c576039afca984cda0f0aed – dmzza 2016-03-29 22:50:12