嵌套模型的大小比 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
希望这不会让它变得更复杂 ;)
我试图了解我在某些 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
希望这不会让它变得更复杂 ;)