Что такое правильный синтаксис Ruby on Rails для записи во вложенную модель в виртуальном атрибуте? - PullRequest
0 голосов
/ 21 июля 2011

Пытаться разделить и победить эти проблемы ( 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 »для #»,Я думаю, что у меня более одной ошибки, но, похоже, это должно работать для меня.Что я делаю не так?

Спасибо!

Редактировать - вот действие создания 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 ]

1 голос
/ 24 июля 2011

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

self.steps = Step.create(...

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

0 голосов
/ 25 июля 2011

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

https://github.com/pixeltrix/cookbook

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