Je construis une base de données de recettes de cuisine dans Rails, et j'essaie de créer une forme pratique pour ajouter des ingrédients en utilisant Jquery.Rails/JQuery best practice
Mes associations:
class Recipe < ActiveRecord::Base
has_many :recipe_ingredients
has_many :ingredients, :through => :recipe_ingredients
accepts_nested_attributes_for :recipe_ingredients
end
class Ingredient < ActiveRecord::Base
end
class RecipeIngredient < ActiveRecord::Base
belongs_to :recipe
belongs_to :ingredient
end
Ma forme de recette ressemble à ceci (simplifié):
<%= simple_form_form(@recipe) do |f| %>
<div class="form-inputs">
<%= f.input :name %>
<fieldset><legend>Ingredients</legend>
<table class="table">
<% @recipe.recipe_ingredients.each do |recipe_ingredient| %>
<tr>
<%= f.fields_for :recipe_ingredients, recipe_ingredient do |dif| %>
<td><%= dif.text_field :ingredient %></td>
<td><%= dif.text_field :amount %></td>
<% end %>
</tr>
<% end %>
</table>
<div class="btn-group">
<a href="#" class="btn btn-primary">Add New Ingredient</a>
</div>
</fieldset>
</div>
<% end %>
Deux questions:
Mon bloc .each semblent corrects pour la les associations? Quelle est la meilleure façon d'ajouter une nouvelle ligne à cette table côté client de sorte que l'assistant de formulaire reconnaît la nouvelle ligne et crée l'insertion db appropriée? Je ne suis pas très clair sur la façon dont la magie de Rails fonctionne en termes de création d'un tableau d'objets comme ça.
Voulez-vous créer des ingrédients en créant une recette ou ajouter les ingrédients existants à la recette? –
@SybariteManoj tu as raison, ça fait toute une différence. En ce qui concerne la question # 2, juste un indice: [attributs imbriqués] (http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html) –
@m_x oui, s'il veut ajouter de nouveaux ingrédients alors nested_attributes sont Mais dans ce cas, il n'y a pas besoin d'association «many-many» car les ingrédients seront toujours créés. Mais s'il veut ajouter les ingrédients existants, alors 'ingredient_ids' peut être utilisé. Et dans le dernier cas où il veut les deux alors il pourrait avoir besoin d'utiliser la combinaison des approches précédentes. :) –