我试图理解我在一些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对象。
任何人都可以帮我解决这个问题吗?
非常感谢你的时间,
答案 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
希望这不会让它变得更复杂;)