Что такое правильный синтаксис 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 %>

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

Спасибо!

Edit - вот действие RecipeController создать

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

2 ответа

Решение

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

https://github.com/pixeltrix/cookbook

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

self.steps = Step.create(...

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

Другие вопросы по тегам