を:http://meals-test2.herokuapp.com/new
-
フォームを使用している場合は、あなたが使用する必要がfields_for
そのように編集してください:
#app/controllers/meals_controller.rb
class MealsController < ApplicationController
def edit
@meal = Meal.find params[:id]
end
private
def meal_params
params.require(:meal).permit(meal_ingredient_attributes: [:amount])
end
end
#app/views/meals/edit.html.erb
<%= form_for @meal do |f| %>
<%= fields_for :meal_ingredients do |i| %>
<%= f.object.ingredient.name #-> meal_ingredient belongs_to ingredient %>
<%= i.number_field :amount %>
<% end %>
<%= f.submit %>
<% end %>
食事のために成分のリストを出してを入力し、「量」の値を入力することができます。
チェックボックスについては、デモアプリケーションを作成して、それが動作するかどうかを確認する必要があります。あなたが必要と感じたら、私はこれを行うことができます。
もう一つの方法は、has_and_belongs_to_many
である:
#app/models/meal.rb
class Meal < ActiveRecord::Base
has_and_belongs_to_many :ingredients do
def amount #-> @meal.ingredients.first.amount
...........
end
end
end
#app/models/ingredient.rb
class Ingredient < ActiveRecord::Base
has_and_belongs_to_many :meals
end
この方法で、あなたは@meal.ingredients.where(ingredients: {id: "x" }).size
と「量」を発見することができ、必要に応じてmeals
/ingredients
として多くを追加することができます。あなたはまた、それを単純化する方法を作ることもできます(上記)。
あなたはこのためにfields_for
を使用する必要はありません:HABTMレコードがモデル内has_many
関連付けを使用しています
#app/controllers/meals_controller.rb
class MealsController < ApplicationController
def new
@meal = Meal.new
end
def edit
@meal = Meal.find params[:id]
end
def update
@meal = Meal.find params[:id]
@meal.save
end
def create
@meal = Meal.new meal_params
@meal.save
end
private
def meal_params
params.require(:meal).permit(ingredient_ids: [])
end
end
ので、それはcollection_singular_ids
方法を提供します。これは、あなたがfields_for
せずに関連付けられたデータを上書きすることができます:
#app/views/meals/new.html.erb
<%= form_for @meal do |f| %>
<%= f.collection_check_boxes :ingredient_ids, Ingredient.all, :id, :name %>
<%= f.submit %>
<% end %>
あなたは余分な成分を追加したい場合は、チェックボックス要素を複製するJSを作成する必要があると思います。これにより、コントローラーにの複数のids
を送信することができます。これにより、dbに盲目的に挿入されます。
このメソッドは、成分リストをに上書きし、habtm関連付け/テーブルに一意性制約がない場合にのみ機能します。
リンクはもはや機能しません。あなたはホストし直すことができますか、あるいは少なくともあなたのソースコードをどこかで指し示すことができますか? – arielkirkwood
一時的なメールを使用したため、アカウントが停止しました。私はあなたのために分で再アップロードします –