【问题标题】:Nested attributes not saving in database? Does not display values - Ruby on Rails嵌套属性未保存在数据库中?不显示值 - Ruby on Rails
【发布时间】:2013-06-14 03:02:28
【问题描述】:

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

我有一个模型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

cmets 迁移文件

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

【问题讨论】:

  • 请在您的控制器中发布create 方法
  • @muttonlamb 你好!我已经编辑了我的帖子以包含 create 方法。有什么问题吗?谢谢!
  • 我看不出有什么问题。如果可能的话,你能分享你的代码吗,我的意思是使用任何公共回购?
  • 您也可以尝试检查日志,那里发生了什么,您保存评论时是否创建了任何评论?
  • @Muntasim 似乎它正在被提交到数据库中,但它没有保存到评论数据库中,从我的日志中有一个 insert into "reviews" 和另一个 insert into "comments"

标签: ruby-on-rails ruby-on-rails-3.2 nested-attributes


【解决方案1】:

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

  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

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

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

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

希望这会有所帮助...

【讨论】:

    【解决方案2】:

    你需要替换下面的

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

    到

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

    以查看创建的 cmets 的形式。正如您在新的行动中拥有@review.comments.build 一样。否则你在编辑审阅时看不到相关的cmets

    【讨论】:

    • 如果我删除 .build,那么 cmets 的字段就会消失
    • 你必须有@review.comments.build 在我提到的新动作和编辑动作@review.comments.build if @review.comments.empty?
    • 我确实有 @review.cmets.build 新动作(我没有碰我以前的代码,它在那里)。我还将最后一位添加到编辑操作中,结果相同。该字段不显示。另外,我忘了提及但不确定是否重要。此表单位于views/reviews/_form.html.erb,但我已在views/users/reviews.html.erb 中呈现此页面
    猜你喜欢
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2016-02-25
    • 1970-01-01
    • 2014-07-28
    • 2014-04-03
    相关资源
    最近更新 更多