Вопрос о модели / форме рельса - PullRequest
1 голос
/ 22 мая 2011

Я делаю менеджер рецептов (который не является их первым приложением?) В Rails, и вот мой макет:

Ingredient belongs to Recipe
Recipe has many Ingredients

Каков наилучший способ сделать форму, котораяотражает эти отношения?Я думал, что ввод, который, когда один заполнен, создает другой, так что всегда есть «еще один» в конце формы для ингредиентов.

Как только я сделал пользовательский интерфейс, какова будет структурамодель и контроллер похожи?Прямо сейчас у меня есть метод scaffolded controller create:

  def create
    @recipe = Recipe.new(params[:recipe])

    respond_to do |format|
      if @recipe.save
        format.html { redirect_to(recipes_path, :notice => 'You made a new 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

Должен ли params[:recipe] быть просто более глубоко вложенным объектом / хэшем / словарем, который содержит массив ингредиентов или что-то еще?

Спасибо за любые указания здесь.

Ответы [ 2 ]

1 голос
/ 22 мая 2011

Вы должны использовать accepts_nested_attributes здесь.

Некоторые ссылки:

API:
http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for
Скринкасты:
http://railscasts.com/episodes/196-nested-model-form-part-1
http://railscasts.com/episodes/197-nested-model-form-part-2

Так ваша модель будет выглядеть так

class Recipie  < ActiveRecord::Base 
  has_many :ingredients
  accepts_nested_attributes_for :ingridients, :allow_destroy => true
end

Просмотров: 1018 * *

<%= form_for @recipe do |f| %>
  ... # reciepe fields
  <%= f.fields_for :ingridients do |i| %>
    ... # your ingridients forms
  <% end %>
  ...
<% end %>

И контроллер

def create
  @recipe = Recipe.new(params[:recipe])
  @recipe.save # some save processing
end
1 голос
/ 22 мая 2011

Просто добавьте ингредиенты через запятую.

Это может быть text_field_tag, потому что вам нужно будет проанализировать его и сохранить каждое слово, разделенное запятой, перед сохранением.

class Recipie  < ActiveRecord::Base 

    has_many :ingredients

    before_save :add_ingredients 

    attr_accessor :ingredients_to_parse #this will be the text_field_tag

    def add_ingredients
        #create an array of ingredients from #ingredients_to_parse
        #then loop through that array i.e. you have your ingredients_array   
        ingredients_array.each do 
            Ingredient.create(:recipe => self, :other_params => 'stuff')
        end
        #there are a lot of ways, I just used create to show you how to add it
    end
end

Итак, в вашей форме просто есть это text_field_tag

<%= form_for(@recipe) do |f| %>
    <% f.text_field :name %>
    <% text_field_tag :ingredients_to_parse %>
    <%= f.submit %>
<% end %>

Затем вы можете добавить Javascript, так что каждый раз, когда в этом добавляется запятая text_field_tag, вы можете просто использовать некоторые js для таких причудливых вещей.

Таким образом, он будет работать, когда серверы работают медленно, js не работает должным образом и т. Д. Всегда полезно сначала запустить HTML-версию.

Удачи, дайте мне знать, если у вас есть вопросы / проблемы.

...