нулевой объект в поле зрения при построении объектов по двум различным ассоциациям - PullRequest
0 голосов
/ 08 февраля 2010

Я относительно новичок в 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? позвонить.

Я всегда получаю ноль за объекты, которые я строю на втором месте. Те, которые я строю первыми, на мой взгляд, не равны нулю. Возможно ли, что я не могу строить объекты для двух разных ассоциаций одновременно? Или я что-то упускаю?

Заранее спасибо!

1 Ответ

1 голос
/ 16 июня 2010

На самом деле я нашел довольно простое решение. Я предоставляю хэш со значениями для идентификаторов языка при построении записей.

@languages = Language.all

@languages.each do |language|
   @painting.paintingtitles.build( {:language_id => language.id} )
   @painting.paintingdescriptions.build( {:language_id => language.id} )
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...