我有一个嵌套属性,我可以显示值,但它没有保存到数据库中为什么?
我有一个模型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
答案 0 :(得分: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
和@review
传递给form_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
还有一些宝石可以处理整个过程,使得评论非常有说服力,可以在这里找到它们
https://www.ruby-toolbox.com/categories/rails_comments
我认为可评价的宝石路径更好,因为它们正在由更大的社区进行,我认为从长远来看,最终会比个人创作更好。
希望这会有所帮助......
答案 1 :(得分:-1)
您需要替换以下
<%= f.fields_for :comments, @review.comments.build do |field| %>
到
<%= f.fields_for :comments, @review.comments do |field| %>
查看表单中创建的评论。正如您在新动作中@review.comments.build
一样。否则,您无法看到关于编辑审核的相关评论