【发布时间】:2011-07-25 16:23:33
【问题描述】:
我有一个帖子模型和一个评论模型。我想将 cmets 限制为 3。你会怎么做?
最好创建一个验证吗?如果是这样,这会是什么样子 喜欢吗?
你会在
unless Post.comments == 3视图中这样做吗?回调有意义吗?
【问题讨论】:
标签: ruby-on-rails validation model
我有一个帖子模型和一个评论模型。我想将 cmets 限制为 3。你会怎么做?
最好创建一个验证吗?如果是这样,这会是什么样子 喜欢吗?
你会在unless Post.comments == 3视图中这样做吗?
回调有意义吗?
【问题讨论】:
标签: ruby-on-rails validation model
帖子的 cmets 计数验证是“评论”模型的责任,所以我想建议以下代码:
class Comment < ActiveRecord::Base
belongs_to :post
before_create :limit_number
private
def limit_number
if post.comments.count >= 3
errors.add(:post, "the limit of comments is over")
end
end
end
class Post < ActiveRecord::Base
has_many :comments
end
【讨论】:
您应该始终在模型级别和视图级别进行验证。
class Comment < ActiveRecord::Base
belongs_to :post
validate :check
private
def check
if post.present?
errors.add("Post", "can not have more than 3 comments") if post.comments.size >= 3
end
end
end
class Post < ActiveRecord::Base
# other implementation...
def commentable?
comments.size <= 3
end
end
然后像这样在您的视图中调用#commentable?。你不应该在视图中硬编码值。
<% if @post.commentable? %>
<%= render "form" %>
<% end %>
【讨论】:
我会确保不要让他们提交您不想允许的第四条评论。有人可能会说您应该在控制器中进行检查并传递一个标志,但是对于这么简单的事情,视图中的检查似乎很好。
【讨论】:
在模型中验证它。您可以按照here 的描述使用validates_with。
在视图中,您最好检查 不等式,例如
unless Post.comments.length >= 3
show_form
end
这样,如果您有 4 个 cmets 出于某种原因(竞争条件或管理员在 3 之后发布响应等),表单将不会显示。
【讨论】: