Rails: многоуровневые вложенные формы (принимает вложенные атрибуты)

Я создаю простое приложение уровня блога. ниже мои модели.

class User < ActiveRecord::Base
  attr_accessible :name,:posts_count,:posts_attributes , :comments_attributes
  has_many :posts
  has_many :comments
  accepts_nested_attributes_for :posts , :reject_if => proc{|post| post['name'].blank?}  , :allow_destroy => true
end


class Post < ActiveRecord::Base
  attr_accessible :name, :user_id ,:comments_attributes
  belongs_to :user
  has_many :comments
  accepts_nested_attributes_for :comments
end

class Comment < ActiveRecord::Base
  attr_accessible :content, :post_id, :user_id
  belongs_to :user
  belongs_to :post  
end

Я пытаюсь создать пользователя, опубликовать и прокомментировать в одной форме, используя функцию accepts_nested_attributes_for рельсов. Ниже мой контроллер и код просмотра.

Контроллер -----------

class UsersController < ApplicationController
  def new
    @user = User.new
    @post = @user.posts.build
    @post.comments.build
  end

  def create
   @user = User.new(params[:user])
   @user.save
  end
end

Форма----------

<%= form_for @user do |f| %>
    <%= f.text_field :name %>

    <%= f.fields_for :posts do |users_post| %>
        <br>Post
        <%= users_post.text_field :name  %>
        <%= users_post.fields_for :comments do |comment| %>
             <%= comment.text_field :content %>
         <% end %>
    <% end %>
    <%= f.submit %>
<% end %>

С помощью приведенного выше кода я успешно могу создать нового пользователя, опубликовать и прокомментировать, но проблема в том, что я не могу назначить вновь созданного пользователя вновь созданному комментарию. Когда я проверил вновь созданный комментарий в базе данных, я получил результат ниже. Я получаю значение поля user_id «ноль».

#<Comment id: 4, user_id: nil, post_id: 14, content: "c", created_at: "2014-05-30 09:51:53", updated_at: "2014-05-30 09:51:53">

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

Спасибо,


person Sanjay Salunkhe    schedule 30.05.2014    source источник


Ответы (1)


Вам нужно будет явно указать user_id для комментариев! Вы вкладываете комментарии в сообщения, поэтому комментарии будут иметь назначенный по умолчанию post_id, но хотя вы косвенно вкладываете комментарии в форму пользователя, прямого вложения комментариев под пользователем нет, поэтому user_id остается пустым в комментариях.

Попробуйте написать после создания обратного вызова в модели комментариев, чтобы установить user_id

В комментарии.рб

after_create{|comment|
  comment.user_id = post.user_id
  comment.save
}

Надеюсь это поможет :)

person Himesh    schedule 30.05.2014