2

私は、ユーザーが他の複数のモデルを参照するオブジェクトを作成し、それらが存在しない場合はそれらを作成し、既存のモデルに関連付けることができる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に埋め込むために使用しようとしました。Uploadfields_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が、それは実際には正しい方法ではありません。

4

1 に答える 1

2

私は次の解決策を使用することになりました、そしてそれはうまくいくようです。求めていた動作を定義するために、一致する仕様でソリューションを保持するための要点を作成しました。

http://gist.github.com/437939

于 2010-06-14T16:55:35.820 に答える