私のコントローラーでは、次のことをしたいと思います。
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