Каков правильный синтаксис Ruby on Rails для записи во вложенную модель в виртуальном атрибуте?

Попытка разделить и победить эти проблемы (1, 2) у меня все еще есть. Я хотел бы написать первый шаг рецепта BLT в моей вложенной модели «многие ко многим» из виртуального атрибута. Позже я хотел бы иметь более сложную форму, поэтому я делаю это в модели.

Я жестко закодировал в модели все, кроме названия рецепта. Вот модель рецепта:

    class Recipe < ActiveRecord::Base
      has_many :steps, :class_name => 'Step'
      has_many :stepingreds, :through => :steps
      has_many :ingredients, :through => :stepingreds
      accepts_nested_attributes_for :steps, :stepingreds, :ingredients
      attr_writer :name_string
      after_save :assign_name

      def name_string
        self[:name]
      end

      def assign_name
        if @name_string
        self[:name] = @name_string
        self[:description] = "Addictive sandwich"
        self.steps = Step.create({
           :number => 1,
           :instructions => 'Cook bacon',
           :stepingreds => [{ :ingredient => { :name => 'Bacon' }, :amount => 4 } ]
          })
       end
    end

А вот и форма

    <%= form_for @recipe do |f| %>
        <%= f.error_messages %>
        <p>
          <%= f.label :name_string, "Name" %><br/>
          <%= f.text_field :name_string %>
        </p>
        <p><%= f.submit %></p>
    <% end %>

Я получаю «Ошибка имени в RecipesController#create, неопределенная локальная переменная или атрибут метода для #». Я думаю, что у меня более одной ошибки, но мне кажется, что это должно сработать. Что я делаю неправильно?

Спасибо!

Изменить. Вот действие создания RecipeController.

   def create
       @recipe = Recipe.new(params[:recipe])
       if @recipe.save
         redirect_to @recipe, :notice => "Delicious BLT created!"
       else
         render :action => 'new'
       end
     end                

comment
Вы можете скопировать и вставить действие RecipesController create?   -  person Anatoly    schedule 21.07.2011


Ответы (2)


Вот простое приложение Rails, которое делает то, что вам нужно:

https://github.com/pixeltrix/cookbook

person pixeltrix    schedule 25.07.2011

Я думаю, что одной из проблем является следующая строка:

self.steps = Step.create(...

Steps через вашу ассоциацию has_many. Таким образом, selft.steps будет содержать список шагов от нуля до многих. Ваше задание через = предоставляет ему один элемент, и это сломает его. Что вы действительно хотите (я думаю), так это создать self.steps как список из одного элемента, а не из одного элемента. Изменение назначения = на << должно выполнить это.

person Ben Morris    schedule 24.07.2011