嵌套模型大小(比)在Rails中更大(+1)

时间:2015-01-02 23:32:40

标签: ruby-on-rails ruby

我试图理解我在一些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语句不会出错。 (无对象)

我的添加评论&#39;来自下面的视图文件的代码,

<%= 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对象。

任何人都可以帮我解决这个问题吗?

非常感谢你的时间,

3 个答案:

答案 0 :(得分:0)

打开rails控制台,试试这个并找到正在发生的事情

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

答案 1 :(得分:0)

太奇怪了,

当我删除

@comment = @donkey.comments.build
来自DonkeyController的

并更改&lt;%= form_for来自([@donkey,@ comment])do | f | %GT;于,

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

错误消失了。

你认为我需要为此打开一张错误票,或者我在控制器内声明@comment时做错了吗。

答案 2 :(得分:0)

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

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

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

<% if comment.id.present? %>

一切都在爆炸。

所以你正在检查它是否具有正确的ID并且首先在这里

<% if comment.persisted? %>

但更多的“Rails Way”将是

<% unless comment.new_record? %>

unless

  

注意上面的{{1}}

请参阅此处了解此内容的API http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-persisted-3F

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