1

我有一个嵌套属性,我可以显示值,但它没有保存到数据库中,为什么?

我有一个模型review,我想嵌套属性comments

查看迁移文件

class CreateReviews < ActiveRecord::Migration
  def change
    create_table :reviews do |t|
      t.belongs_to :reviewable, polymorphic: true
      t.timestamps
    end
    add_index :reviews, [:reviewable_id, :reviewable_type]

  end
end

审查模式

class Review < ActiveRecord::Base
  attr_accessible :rating, :user_id, :comments_attributes, :service
  has_many :comments, as: :commentable
  belongs_to :user
  belongs_to :reviewable, polymorphic: true

  accepts_nested_attributes_for :comments

end

评论迁移文件

class CreateComments < ActiveRecord::Migration
  def change
    create_table :comments do |t|
      t.text :content
      t.belongs_to :commentable, polymorphic: true
      t.integer :user_id
      t.timestamps
    end
    add_index :comments, [:commentable_id, :commentable_type]
  end
end

评论模型

class Comment < ActiveRecord::Base
  attr_accessible :content, :user_id
  belongs_to :commentable, polymorphic: true
  belongs_to :user
  belongs_to :review
end

这是表格

<%= form_for [@reviewable, @review], :html => {:multipart => true} do |f| %>

  <%= f.fields_for :comments, @review.comments.build do |field| %>
    <%= field.label "Comment" %></div>
    <%= field.text_field :content %>
  <% end %>

  <%= f.submit %>
<% end %>

它显示了字段,但是我保存时怎么没有保存?

我试图这样显示:

<%= @review.comments %>

这是我的审查控制器

  def new
    @review = @reviewable.reviews.new
    @review.comments.build
  end

谢谢你的帮助!

编辑:

审查控制器:创建方法

  def create
    @review = @reviewable.reviews.new(params[:review])
    @review.user = current_user
    if @review.save
      redirect_to @reviewable, notice: "review created."
    else
      render :new
    end
  end
4

2 回答 2

0

您的控制器和视图中似乎有一些混乱的逻辑

  def new
    @review = @reviewable.reviews.new
    @review.comments.build
  end

你在这里打电话@reviewable.reviews.new,但@reviewable还不存在。一种更常用的调用方式是Review.new

接下来在你看来你这样做

<%= form_for [@reviewable, @review], :html => {:multipart => true} do |f| %>

  <%= f.fields_for :comments, @review.comments.build do |field| %>

这是传递@reviewable@reviewform_for这似乎很奇怪。使用嵌套,您通常只需要传递顶级实例变量,即@review.

接下来,当你到达时,fields_for你正在路过:comments@review.comments.build。一般来说,这应该只需要:comment,因为您已经在控制器中构建了注释。

我建议您查看这两个截屏视频

http://railscasts.com/episodes/196-nested-model-form-part-1 http://railscasts.com/episodes/197-nested-model-form-part-2

还有一些 Gems 可以非常雄辩地处理使事物可评论的整个过程,可以在这里找到它们

https://www.ruby-toolbox.com/categories/rails_comments

我认为可评论的 Gems 路径更好,因为它们正在由一个更大的社区开发,而且我认为从长远来看最终会比个人创作更好。

希望这可以帮助...

于 2013-06-14T05:04:55.450 回答
-1

您需要替换以下内容

<%= f.fields_for :comments, @review.comments.build do |field| %>

<%= f.fields_for :comments, @review.comments do |field| %>

在表单中查看创建的评论。正如你@review.comments.build在新的行动中所做的那样。否则你看不到编辑评论的相关评论

于 2013-06-14T04:37:01.237 回答