Rails: has_many через ассоциацию и форму для создания новых экземпляров - PullRequest
4 голосов
/ 12 января 2010

Я по-прежнему супер новичок в Rails, и просто пытаюсь настроить мое первое has_many через настройку ассоциации.

Рецепты имеют много ингредиентов, и каждый ингредиент имеет количество, необходимое для рецепта. В таблице component_amount есть recipe_id, component_id и количество.

При создании нового рецепта я хочу иметь возможность создавать эти ассоциации рецептов и ингредиентов в одном месте. В конце я собираюсь создать автозаполнение AJAX для ингредиентов. На данный момент, как маленький шаг, я хотел бы просто предположить, что ингредиент существует, и позаботиться о проверке, как только у меня будет эта часть.

Итак, как мне сделать new.html.erb для рецептов? Как я могу продлить форму для более чем одного ингредиента?

Как сейчас, после прохождения http://weblog.rubyonrails.org/2009/1/26/nested-model-forms Я до сих пор не могу получить поля для добавления ингредиентов. Текущий код ниже.

class Recipe < ActiveRecord::Base
    has_many :ingredient_amounts
    has_many :ingredients, :through => :ingredient_amounts
    accepts_nested_attributes_for :ingredient_amounts, :allow_destroy => true
end

class IngredientAmount < ActiveRecord::Base
  belongs_to :ingredient
  belongs_to :recipe
end

class Ingredient < ActiveRecord::Base
  has_many :ingredient_amounts
  has_many :recipes :through => :ingredient_amounts
end

Вот новый.html.erb, как он у меня есть:

   <h1>New recipe</h1>

<% form_for @recipe do |f| %>
  <%= f.error_messages %>

  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :instructions %><br />
    <%= f.text_area :instructions %>
  </p>
  <p>
    <%= f.label :numberOfServings %><br />
    <%= f.text_field :numberOfServings %>
  </p>
  <p>
    <%= f.label :prepTime %><br />
    <%= f.text_field :prepTime %>
  </p>

  <p>
    <% f.fields_for :ingredient_amounts do |ingredient_form| %>
    <%= ingredient_form.label :ingredient_formedient_id, 'Ingredient' %>
      <%= ingredient_form.collection_select :ingredient_id, Ingredient.all, :id, :name, :prompt => "Select an Ingredient"%>
      <%= ingredient_form.text_field :amount %>
    <% unless ingredient_form.object.new_record? %>
        <%= ingredient_form.label :_delete, 'Remove:' %>
        <%= ingredient_form.check_box :_delete %>

    <% end %>
  </p>
  <% end %>
  <p>
    <%= f.submit 'Create' %>
  </p>
<% end %>

<%= link_to 'Back', recipes_path %>

Важные биты контроллера рецептов:

def new
    @recipe = Recipe.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @recipe }
    end
  end
  def create
    @recipe = Recipe.new(params[:recipe])

    respond_to do |format|
      if @recipe.save
        flash[:notice] = 'Recipe was successfully created.'
        format.html { redirect_to(@recipe) }
        format.xml  { render :xml => @recipe, :status => :created, :location => @recipe }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @recipe.errors, :status => :unprocessable_entity }
      end
    end
  end

И ... Я не знаю, с чего начать в контроллере ингридиента ингридиентов. Это был мой самый первый удар, и я уверен, что это не так близко:)

def new
    @recipe = Recipe.find(params[:recipe_id])
    @ingredient = Ingredient.find(params[:ingredient_id])
    @ingredient_amount = Recipe.ingredient_amounts.build
  end

Спасибо за помощь!

1 Ответ

1 голос
/ 12 января 2010

Я считаю, что вы ищете "Вложенные модельные формы".

Попробуйте эту ссылку: http://weblog.rubyonrails.org/2009/1/26/nested-model-forms

Трудно понять, что искать, если вы не знаете терминологию, с которой начинаете :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...