2016-08-18 3 views
1

IngredientMealMealIngredientで接続するレシピアプリ用の結合テーブルの設定でhas_manyを持っています。 MealIngredientの範囲内では、meal_idingredient_id、およびamountです。Rails 4 HMT関連の結合テーブルの属性を保存および更新するにはどうすればよいですか?

私の質問は:どのように私は食事のフォームの量の列を保存して更新できますか?成分を追加するための

私のフォームフィールドは、次のようになります。私は、各成分のための量を節約するにはどうすればよい

<% Ingredient.all.each do |ingredient| %> 
    <label> 
    <%= check_box_tag "meal[ingredient_ids][]", ingredient.id, f.object.ingredients.include?(ingredient) %> 
    <%= ingredient.name %> 
    </label> 
    <br /> 
<% end %> 

私はここで見つけるこの質問参照しています:私はあなたのためのデモを作っRails 4 Accessing Join Table Attributes

答えて

2

を:http://meals-test2.herokuapp.com/new enter image description here

-

フォームを使用している場合は、あなたが使用する必要が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関連付け/テーブルに一意性制約がない場合にのみ機能します。

+0

リンクはもはや機能しません。あなたはホストし直すことができますか、あるいは少なくともあなたのソースコードをどこかで指し示すことができますか? – arielkirkwood

+0

一時的なメールを使用したため、アカウントが停止しました。私はあなたのために分で再アップロードします –

関連する問題