Что такое правильный синтаксис 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, которое делает то, что вам нужно:
Я думаю, что одна проблема заключается в следующей строке:
self.steps = Step.create(...
Steps
через вашу ассоциацию has_many. Таким образом, selft.steps будет содержать список шагов от нуля до многих. Ваше назначение через =
предоставляет ему один предмет, и это сломает его. То, что вы действительно хотите (я думаю), это создать self.steps в виде списка одного элемента, а не одного элемента. Изменение =
назначение на <<
должен сделать это.