【问题标题】:How to customize the validations in rails if the request comes from specific controller?如果请求来自特定控制器,如何自定义 Rails 中的验证?
【发布时间】:2017-03-19 22:41:52
【问题描述】:

假设我想让发布两种类型的帖子 [long] 和 [short] 共享同一个表 [id, title, content, short:boolean, user_id] 和模型

并且用户选择发布简短的帖子,并且该网站将仅存储内容并且它将在 120 个字符以下,为了识别它,我们将输入 short:true,但是如果它选择了允许,如何自定义验证120 字符以下的空标题和内容.....等

【问题讨论】:

  • 这取决于您使用的 Rails 版本。在最新版本中,可以设置自定义验证上下文。
  • 但在更复杂的应用程序中最好使用表单对象恕我直言。

标签: ruby-on-rails ruby validation activerecord


【解决方案1】:

解决问题的最简单方法是条件验证。你的模型应该是这样的:

class Post < ActiveRecord::Base
  validates :title, presence: true, unless: :short?
  validates :title, absence: true, if: :short?
  validates :content, presence: true
  validates :content, length: { maximum: 120 }, if: :short?
end

我不确定我是否正确理解了您示例中的所有条件,希望这段代码足以满足您的需求。

您还可以在Rails documentation 中阅读有关条件验证的详细信息。

【讨论】:

    【解决方案2】:

    由于您在 Post 上有一个 short 布尔字段,您可以简单地添加这些辅助方法

    class Post < AR 
      # this method is automatically generated by rails
      def short?
        short
      end
    
      def long?
        !short
      end
    end
    

    然后将if:unless: 添加到您的验证中:

    validates :content, length: { maximum: 120 }, if: :short?
    validates :content, presence: true, if: :long?
    

    【讨论】:

    • 但是控制器端我应该为短帖子创建新的计数器
    • 不,只需使用所有参数创建对象,其余的将由验证完成
    猜你喜欢
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多