Ruby rails 3 Вложенная форма не может быть сохранена, потому что метод before_save обращается к родительской модели, объект которой равен нулю

У меня есть вложенная форма/модель в моем приложении rails, которая будет работать нормально, за исключением того, что метод before_save не имеет доступа к родительскому объекту @user при работе с вложенной формой. Хотя он отлично работает при сохранении самой подмодели.

Итак, вот упрощенный код

class Forum < ActiveRecord::Base
  has_many :forum_post, :dependent => :destroy
  belongs_to :project
  accepts_nested_attributes_for :forum_post,  :reject_if => :all_blank
end

class ForumPost < ActiveRecord::Base
    belongs_to :forum    
    belongs_to :user
    before_save :toggle_forum              
    has_attached_file :attachment

 def toggle_forum   
    #a bunch of code
    #one line tries to access @user.id but it fails because @user is nil
    @user.id


  end

 end

Затем в моем контроллере ForumControler, который обновляет это, у меня есть

def update
 @forum = Forum.find(params[:id])    
 if @forum.update_attributes(params[:forum])               
     redirect_to(user_forum_path(@user,@forum.project,@forum), :notice => 'Forum was successfully updated.')
  else        
     render :action => 'submit'        
  end

конец

И на мой взгляд:

<%= form_for(@forum, :url => user_forum_path, :html => { :multipart => true, :id => :project } ) do |f| %>    
    <div class="form-label-row summary-text">
      <%= f.label(:summary_text, 'Final Summary') %>
      <%= f.text_area :summary_text %>
    </div>

    <%= f.fields_for :forum_post,$forum_post do |child_form| %>
        <div class="form-row-left attachment">
            <%= child_form.label :attachment %>
            <%= child_form.file_field :attachment %>    
        </div>
        <!-- I tried adding with and without the next 2 hidden fields and it failed either way -->
        <%= child_form.hidden_field :user_id, :value=>@user.id %>               
        <%= child_form.hidden_field :forum_id, :value=>@forum.id %>
    <% end %>

    <%= hidden_field(:forum, :state, :value => :student_completed) %>
    <div class="form-buttons" id="submit">
        <%= f.submit "Submit Project" %>
    </div>
<% end %>

Проблема в том, что если @user равен нулю при сохранении forum_post как вложенного объекта. Если я сохраняю forum_post в его собственной модели, он работает нормально. Любая идея, почему переменная @user не заполняется при сохранении из родительского объекта?


person Matt Wolfe    schedule 17.01.2012    source источник
comment
Где создается @user? Кажется, что это происходит из ниоткуда в вашем действии обновления.   -  person bostonou    schedule 17.01.2012


Ответы (1)


Вы уверены, что хотите использовать переменную экземпляра, а не ассоциацию? Пытаться:

 def toggle_forum   
   #a bunch of code
   #one line tries to access @user.id but it fails because @user is nil
   user.id
 end
person miked    schedule 17.01.2012
comment
Вот в чем проблема.. Странно, что он работал с @user.id, когда он был установлен через объект, созданный непосредственно с помощью ForumPost.. Заставляет меня задуматься, какова область действия переменных класса в ruby, потому что они были в совершенно разных классах.. Возможно, это произошло поставить в другое место.. - person Matt Wolfe; 17.01.2012
comment
Спасибо. Я застрял на аналогичной проблеме, когда пытался получить доступ к self.parent для производного значения дочернего элемента во время обратного вызова before_create. Доступ к родителю напрямую решил мою проблему с областью видимости. - person Dan; 03.07.2013