0

私のコントローラーでは、次のことをしたいと思います。

class SubsController < ApplicationController

 def push_sub
    @sub = Sub.find(params[:id])
    @food = Food.find("ID of food selected from collection_select") => see my form down below
    @food.subs << @sub
  end

  private

    def sub_params
      params.require(:sub).permit(:name, :description)
    end
end

@food.subs は、たとえば次のような ActiveRecord::Associations::CollectionProxy を返します。

 => #<ActiveRecord::Associations::CollectionProxy [#<Sub id: 34, name: "Fake choco", description: "cacao fake", created_at: "2015-01-07 23:40:25", updated_at: "2015-01-07 23:40:25">, #<Sub id: 34, name: "Fake choco", description: "cacao fake", created_at: "2015-01-07 23:40:25", updated_at: "2015-01-07 23:40:25">, #<Sub id: 34, name: "Fake choco", description: "cacao fake", created_at: "2015-01-07 23:40:25", updated_at: "2015-01-07 23:40:25">]> 

私のフォームで f.submit をクリックすると、選択したアイテム (@food) の関連付けに新しい @sub をプッシュする push_sub アクションがトリガーされます。

コントローラーで使用できるように、選択した食品の ID をフォームで取得する方法がわかりません。

ここに私のフォームがあります:

<%= form_for @sub, :url => {:action => "push_sub"} do |f| %>

  <h1>What food is <%="#{@sub.name}"%> a substitute of?</h1>

  <div class="field">
    <%=collection_select(:sub, :foods, Food.all, :id, :name)%>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

よろしくお願いいたします。

明けましておめでとうございます。

アントワーヌ

アップデート

私は has_many スルー リレーションシップを持つ 3 つのモデルを持っています: Food (例: チョコレート)、Sub (チョコレートの代替食品)、Joint (ジョイント テーブル)。

class Food < ActiveRecord::Base
    has_many :joints
    has_many :subs, :through => :joints
    accepts_nested_attributes_for :subs, reject_if: :all_blank, allow_destroy: true
end
class Sub < ActiveRecord::Base
    has_many :joints
    has_many :foods, :through => :joints
    accepts_nested_attributes_for :foods, reject_if: :all_blank, allow_destroy: true
end
class Joint < ActiveRecord::Base
    belongs_to :food
    belongs_to :sub
end
4

1 に答える 1

0

私は答えを見つけました:

次のように、コントローラーのパラメーターを反復処理できます。

   params[:sub].each do |k, v|
      @food_id = v
    end

したがって、@food_id を使用して Sub をアクティブなレコード コレクション プロキシにプッシュできます。

于 2015-01-10T18:19:36.090 に答える