2

私は2つのモデルを持っています:ステーションと飲み物

ステーションhas_many:drinks and Drinksbelongs_to:stations

ステーションを作成するときに、そのステーションに属する飲み物を4つ選択できるようにフォームを作成しようとしています。

原形:

<%= semantic_form_for [:admin, @station] do |f| %>
<fieldset class="inputs">
    <ol>
        <%=f.input :name %>
        <%=f.input :number, :as => :number %>
    </ol>
</fieldset>
<%= f.buttons :commit %>

現在のステーションにDrink#1、#2、#3、#4を選択できるように、このフォームに4つの(選択)入力フィールドを作成する方法を見つけようとしています。何か案は?

私は現在試していますaccepts_nested_attributes_for :drinks, :allow_destroy => true.

飲み物belongs_to:station

id | name | station_id |

ステーションhas_many:drinks

id | name |

更新 tihmが以下に示すように、これを使用して4つの飲み物を追加し、それらの値を編集できます。

<% f.fields_for :drinks do |drink_form| %>
            <%# Put your inputs here...could be a select box %>
            <%= drink_form.select :name, [['Drink #1', 'drink_1'],['Drink #2', drink_2] %>  

            <%# Or a plain input %>
            <%= drink_form.input :description %>  

            <%# ... Any other drink attributes ... %>
        <% end %>

しかし、私がやろうとしているのは、それぞれがリストする4つの選択ボックスを生成Drink.allし、1つの飲み物オブジェクトを別の飲み物オブジェクトと交換できるようにすることです。したがって、最初の選択ボックスの値をコークスからペプシに変更すると、コークスからstation_idが削除され、station_idがペプシに追加されます。

飲み物の属性を編集できる必要はありません。このステーションに関連付けられている飲み物を変更するだけです。これは同じ形で可能ですか?

4

2 に答える 2

1

残念ながら、「ベストプラクティス」のレールの方法を見つけることができませんでした...そのため、それを実装するために一連のAJAX/カスタムrubyコードを実行することになりました。ここにあります(多分それは他の誰かを助けるでしょう):

<% @drinks = Drink.all %>
    <fieldset class="inputs">
        <ol>
        <% @station.drinks.each_with_index do |d,i| %>
            <li>
                <label class="label" for="station_name">Item</label>
                <%=select("drink", "id", @drinks.collect { |d| [d.name,d.id] }, {:include_blank => true, :selected => d.id}, {:class => "station-items"})%>
            </li>
        <% end %>
        <% m = 4-@station.drinks.count %>
        <% m.times do %>
            <li>
                <label class=" label" for="station_name">Item</label>
                <%=select("drink", "id", @drinks.collect { |d| [d.name,d.id] }, {:include_blank => true}, {:class => "station-items"})%>
            </li>
        <% end %>
        </ol>
    </fieldset>
    <%= f.buttons :commit %>
<% end %>

<script>    
$(".station-items").on("change",function(){
  var node = $(this)
  , prev = node.attr('data-rel')
  , next = parseInt(node.val())
  , station_id = $("#station_id").val()

  if(next) {
    $.ajax({
      url: "/drinks/"+next+".json",
      type: "PUT",
      data: { id:next, "drink[station_id]":station_id }
    });
  }

  if(prev) {
    $.ajax({
      url: "/drinks/"+prev+".json",
      type: "PUT",
      data: { id:prev, "drink[station_id]":"" }
    });
  }

  $(this).attr('data-rel',next);
});

$('.station-items option:selected').each(function(){
  return $(this).parent().attr('data-rel',$(this).val())
});
</script>
于 2012-05-07T17:47:35.260 に答える
1

あなたは見ることから始めたいと思うでしょう:

常に 4 つ以下になることがわかっている場合は、少し簡単で、Railscasts から js をスキップできます。

コントローラーで、必要な空の飲み物オブジェクトを必ず作成してください。

....
@station = Station.new
4.times do
  @station.drinks.build
end
...

このように、ビューの #fields_for には反復するオブジェクトがあります。あなたの見解では、何かが似ています:

<%= semantic_form_for [:admin, @station] do |f| %>
<fieldset class="inputs">
    <ol>
        <%=f.input :name %>
        <%=f.input :number, :as => :number %>
        <% f.fields_for :drinks do |drink_form| %>
            <%# Put your inputs here...could be a select box %>
            <%= drink_form.select :name, [['Drink #1', 'drink_1'],['Drink #2', drink_2] %>  

            <%# Or a plain input %>
            <%= drink_form.input :description %>  

            <%# ... Any other drink attributes ... %>
        <% end %>
    </ol>
</fieldset>
<%= f.buttons :commit %>

#select は、選択対象とそのデータの構造に大きく依存します。モデル、単純なリストなどから来ていますか?

于 2012-05-03T18:09:43.053 に答える