私は、ユーザーが他の複数のモデルを参照するオブジェクトを作成し、それらが存在しない場合はそれらを作成し、既存のモデルに関連付けることができる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が戻ることはありません。)
コントローラーは特別なものではなく、標準のRESTful 7であり、モデル内のほとんどのロジックを維持しながら、これを適切に実行できると思います。
ユーザーに複数の異なるフォームに入力してからそれらのオブジェクトを個別に参照させる代わりに、次を使用してそれらをフォーム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
。この回答で言及されていることを適用しようとしましたが、関連付けが欠落しているため、モデルは保存に失敗しました。
sensor=
andobserved_property=
メソッドをオーバーライドしたり、のハッシュをキャッシュしたりするなど、いくつかのハックなことを試みましたbefore_save
が、それは実際には正しい方法ではありません。