Я относительно новичок в Ruby on Rails, поэтому, пожалуйста, не обращайте внимания на мой уровень новичка!
У меня есть следующие модели:
class Paintingdescription < ActiveRecord::Base
belongs_to :paintings
belongs_to :languages
end
class Paintingtitle < ActiveRecord::Base
belongs_to :paintings
belongs_to :languages
end
class Painting < ActiveRecord::Base
has_many :paintingtitles, :dependent => :destroy
has_many :paintingdescriptions, :dependent => :destroy
has_many :languages, :through => :paintingdescriptions
has_many :languages, :through => :paintingtitles
end
class Language < ActiveRecord::Base
has_many :paintingtitles, :dependent => :nullify
has_many :paintingdescriptions, :dependent => :nullify
has_many :paintings, :through => :paintingtitles
has_many :paintings, :through => :paintingdescriptions
end
В моем представлении рисования нового / редактирования я хотел бы показать детали рисования вместе с его заголовком и описанием на каждом из языков, чтобы я мог сохранить перевод этого поля.
Чтобы создать языковые заголовки и записи описания языка для моей картины и каждого из языков, я написал следующий код в новом методе моего Paintings_controller.rb:
@temp_languages = @languages
@languages.size.times{@painting.paintingtitles.build}
@painting.paintingtitles.each do |paintingtitle|
paintingtitle.language_id = @temp_languages[0].id
@temp_languages.slice!(0)
end
@temp_languages = @languages
@languages.size.times{@painting.paintingdescriptions.build}
@painting.paintingdescriptions.each do |paintingdescription|
paintingdescription.language_id = @temp_languages[0].id
@temp_languages.slice!(0)
end
В частичной форме, которую я вызываю в новом / редактируемом виде, у меня есть
<% form_for @painting, :html => { :multipart => true} do |f| %>
...
<% languages.each do |language| %>
<p>
<%= label language, language.name %>
<% paintingtitle = @painting.paintingtitles[counter] %>
<% new_or_existing = paintingtitle.new_record? ? 'new' : 'new' %>
<% prefix = "painting[#{new_or_existing}_title_attributes][]" %>
<% fields_for prefix, paintingtitle do |paintingtitle_form| %>
<%= paintingtitle_form.hidden_field :language_id%>
<%= f.label :title %><br />
<%= paintingtitle_form.text_field :title%>
<% end %>
<% paintingdescription = @painting.paintingdescriptions[counter] %>
<% new_or_existing = paintingdescription.new_record? ? 'new' : 'new' %>
<% prefix = "painting[#{new_or_existing}_title_attributes][]" %>
<% fields_for prefix, paintingdescription do |paintingdescription_form| %>
<%= paintingdescription_form.hidden_field :language_id%>
<%= f.label :description %><br />
<%= paintingdescription_form.text_field :description %>
<% end %>
</p>
<% counter += 1 %>
<% end %>
...
<% end %>
Но при запуске кода ruby обнаруживает нулевой объект при оценке paintingdescription.new_record?:
You have a nil object when you didn't expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.new_record?
Однако, если я изменю порядок, в котором я
а) создать заголовки и описания живописи в новом методе painting_controller и
б) показать заголовки и описания картин в виде частичного
тогда я получу ноль на paintingtitles.new_record? позвонить.
Я всегда получаю ноль за объекты, которые я строю на втором месте. Те, которые я строю первыми, на мой взгляд, не равны нулю.
Возможно ли, что я не могу строить объекты для двух разных ассоциаций одновременно? Или я что-то упускаю?
Заранее спасибо!