1

さて、何よりもまず、私は非常に複雑なことをしています。間違った方向に行ってしまった可能性があります。

私が現在持っているのは、STI 継承モデル、StateDescription です。StateDescription のサブクラスは、"LocationHasItem" や "ItemNearOtherItem" など、気にすることができる特定の状態を記述します。

StateDescription のすべてのサブクラスがすべての可能な変数を使用するわけではないため、最終的にこれをマルチテーブル継承モデルにアップグレードしたいと思うかもしれないことを理解しています (ただし、高度な重複があります)。

これらの StateDescriptions は、「has_many/belongs_to」関係で別のクラスによって所有されています。

したがって、この他のクラスのフォーム内には、次のものがあります。

<%= f.fields_for :conditions do |e| %>  
        <br> 
        <%= render :partial =>"/state_descriptions/form", :locals => {:e => e, :universe => @story_section.universe, :div_id => "condition"}%>
        <Br>
      <% end %>

StateDescription 自体は、どのタイプをレンダリングする必要があるかを確認し、適切なパーシャルを次のようにレンダリングします (わかりやすくするために、1 つのサブクラスのみを表示します)。

<div id="<%=div_id%><%=e.object.id%>">
          <li>
            <%= e.select(:type, StateDescription.subclasses.collect{|x| x.to_s}) %>

            <br>
            <%= e.label "Inverted?" %>
            <%= e.check_box :invert %>
            <Br>
        <% if e.object.type.to_s == "StateDescription::ItNear" %>
           <%= render :partial =>"/state_description/it_nears/form", :locals => {:e => e, :universe => universe, :div_id => div_id}%>
        <% end %>
            <% end %>

            </li>
  </div>

サブクラスのパーシャルは次のようになります。

<%=e.collection_select 'item_id', universe.items, :id, :title%>
<%= e.object.title_middle_fragment%>
<%=e.collection_select 'item2_id',universe.items, :id, :title%>

したがって、フォームはすべてのサブクラスで同じように開始され、必要な場合にのみ異なります。

これは完全に機能し、私はそれに非常に満足していました...サブクラスが選択した入力フィールドから選択されたときに正しいフォームでWebページを更新することを決定するまで。

その後、フォーム ヘルパー参照 (この場合は "e") をコントローラーからパーシャルに渡すことができないことに気付きました。

この場合のベストプラクティスはありますか、それとも私は非常に複雑なことをしているので、まっすぐなjQueryなどを実行してレールを除外する必要がありますか?

フォーム全体 (各サブクラスに共通するものを含む) を各サブクラス フォームに入れると、あまり乾燥していないように見えます。それだけでなく、StateDescription サブクラスを親クラスに関連付けることができるかどうかもわかりません...

しかし、私がAJAXを行うと、ネストされたフォームについて心配することはできず、親を隠しフィールドか何かにして、AJAXを介してStateDescriptionsを独自に保存することができなかったと思いますか?

これが最善の解決策でしょうか(それが機能する場合でも?)、または私が見逃している簡単なRailsの方法はありますか?

4

2 に答える 2

0

「has_many/belongs_to」関係で別のクラスが所有するSTIモデルでも同様の問題がありました。この別のクラスのフォームを動的に構築するために、cocoongem とsimple_form.

Cocoon は、基本 STI クラスから継承する各具象クラスのフィールドを動的に追加/削除するメソッドを追加します。

例 (Publication は所有者クラス、Item は基本 STI モデル、Post、Video、および Image はそれを継承します):

# _form.html.haml

= simple_form_for @publication, :html => { :multipart => true } do |f|

  = f.simple_fields_for :items do |item|
    = render 'item_fields', :f => item
    = link_to_add_association 'Add a Post', f, :items, :wrap_object => Proc.new { |item| item = Item.new }
    = link_to_add_association 'Add an Image', f, :items, :wrap_object => Proc.new { |item| item = Image.new }
    = link_to_add_association 'Add a Video', f, :items, :wrap_object => Proc.new { |item| item = Video.new }

    = f.button :submit, :disable_with => 'Please wait ...', :class => "btn btn-primary", :value => 'Save'

proc は、 orなどの正しいパーシャルをレンダリングする:wrap_object具象クラスを渡します。item_fieldsimage_fieldsvideo_fields

これが役立つことを願っています。

この問題については、 http ://www.powpark.com/blog/programming/2014/05/07/rails_nested_forms_for_single_table_inheritance_associations に詳しい説明を書きました。

于 2014-05-07T21:36:45.663 に答える
0

まあ、これが最も簡単な方法なのか、それとも DRYist の方法なのかはまだわかりませんが、最終的にはフォーム全体を部分的に配置し、ネストされたフォームを気にしませんでした。これは、AJAX ソリューションで問題なく機能しました。

共通のフォーム要素を毎回繰り返すのは悲しいことですが、AJAX 機能にとってはそれだけの価値があります。

もう少しDRYにしてみます。サブクラスのパーシャルをフォームを必要としないようにすることもできますが、スーパークラスのフォームのパーシャルを呼び出して、各サブクラスが共通に持つ要素を挿入することもできます。

于 2013-09-07T14:10:48.033 に答える