嵌套模型的大小比 Rails 中的要大 (+1)

Nested model size is bigger(+1) than used to be in Rails

我试图了解我在某些 Rails 项目中遇到的问题。我有两个模型,

第一个:

class Donkey < ActiveRecord::Base
  has_many :comments, dependent: :destroy

  validates :name, :surname, :age, presence: true 
end

第二个:

class Comment < ActiveRecord::Base
  belongs_to :donkey

  validates :comment, :commenter, presence: true
end

我的问题是在我向 Comment 模型添加记录之前,@donkey.comments.size 是 1,返回的对象是 nil。

为了避免这种情况,我正在使用

<% @donkey.comments.each do |comment| %>
    <p><strong><%= comment.commenter %></strong></p>
    <p><%= comment.comment %></p>

    <% if comment.id.present? %>

    <p><%= link_to 'Destroy Comment', donkey_comment_path(@donkey, comment),
                method: :delete, data: { confirm: 'Do you really want to delete this question?' } %></p>

    <% end %>

<% end %>

以上代码在我的视图文件中,如果你注意的话,你会看到我正在使用 if 语句来避免出错。 (无对象)

我的 'adding comment' 代码来自下面的视图文件,

<%= form_for([@donkey, @comment]) do |f| %>
  <p><%= f.label :commenter %>: <%= f.text_field :commenter %></p>
  <p><%= f.label :comment %>: <%= f.text_area :comment %></p>
  <%= f.submit %>
<% end %>

并且@comment = @donkey.comments.build 在我的控制器中。

我试图理解这个错误,这就是我制作这样一个简单模型的原因。我正在检查 SQL 服务器里面没有记录但是 @donkey.comments.size 是 1 和一个 nil 对象。

谁能帮我解决这个问题?

非常感谢您的宝贵时间,

打开 rails 控制台,试试这个,看看发生了什么

> @donkey = Donkey.find(1)
> @donkey.comments
> @donkey.comments.inspect
> @donkey.comments.size

真奇怪,

当我删除

@comment = @donkey.comments.build

来自 DonkeyController 并从 ([@donkey, @comment]) 更改 <%= form_for do |f| %> 至

form_for([@donkey, @donkey.comments.build]) do |f|

错误消失。

你认为我需要为此打开错误票还是我通过在控制器中声明@comment 做错了什么。

build 在您的控制器中发表评论的原因是您可以在您的视图中访问它,然后在提交时将其与表单一起发送。

如果您在视图中使用 form.fields_for 来访问与您尝试以该形式创建的主要对象的关系,则这是一种常见模式。在您的情况下,@donkey 将是您的主要对象,您可以在视图中访问一个 comment,您可以遍历 @donkey.comments,并且您将始终至少显示一个.

问题是您正在将非持久性评论添加到 @donkey.comments 列表中,但它还没有 id 所以当您在此处引用它时

donkey_comment_path(@donkey, comment)

一切都会爆炸。

所以你在这里首先检查它是否有 ID 是正确的做法

<% if comment.id.present? %>

但更多的 "Rails Way" 将是

<% if comment.persisted? %>

<% unless comment.new_record? %>

notice the unless above

API 看这里 http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-persisted-3F

希望这不会让它变得更复杂 ;)