【问题标题】:Rails Design QuestionRails 设计问题
【发布时间】:2011-07-25 16:23:33
【问题描述】:

我有一个帖子模型和一个评论模型。我想将 cmets 限制为 3。你会怎么做?

  1. 最好创建一个验证吗?如果是这样,这会是什么样子 喜欢吗?

  2. 你会在unless Post.comments == 3视图中这样做吗?

  3. 回调有意义吗?

【问题讨论】:

    标签: ruby-on-rails validation model


    【解决方案1】:

    帖子的 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
    

    【讨论】:

    • 要提供视图功能,您可以使用辅助方法
    【解决方案2】:

    您应该始终在模型级别和视图级别进行验证。

    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 %>
    

    【讨论】:

      【解决方案3】:

      我会确保不要让他们提交您不想允许的第四条评论。有人可能会说您应该在控制器中进行检查并传递一个标志,但是对于这么简单的事情,视图中的检查似乎很好。

      【讨论】:

        【解决方案4】:

        在模型中验证它。您可以按照here 的描述使用validates_with

        在视图中,您最好检查 不等式,例如

        unless Post.comments.length >= 3
          show_form
        end
        

        这样,如果您有 4 个 cmets 出于某种原因(竞争条件或管理员在 3 之后发布响应等),表单将不会显示。

        【讨论】:

          猜你喜欢
          • 2011-06-29
          • 1970-01-01
          • 1970-01-01
          • 2011-10-07
          • 2013-01-12
          • 1970-01-01
          • 1970-01-01
          • 2012-08-04
          • 1970-01-01
          相关资源
          最近更新 更多