【问题标题】:Skip validation inside specific control跳过特定控件内的验证
【发布时间】:2021-09-16 10:58:43
【问题描述】:

我创建了一个用户控制器,对密码进行了以下验证:

validates :password, length: {minimum: 3, message: 'is too short, minimum of 3 characters'}, on: [:create, :update]

但在另一个控制器中,我执行此操作:

def create
  user_params = params.require(:user).permit(:email)
  @user = User.find_by_email(user_params[:email])

  if @user
    @user.regenerate_recover_password
    ...

所以我收到以下错误:

Validation failed: Password is too short, minimum of 3 characters

基本想法是进行此验证,否则可能会使用空密码

有什么想法吗? 谢谢

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    保存

    参考:Rails skip validation within model with save?

    .save(validate: false)
    

    更新

    您可能必须在函数中使用它。如果您更新而不是保存:https://stackoverflow.com/a/9474881/1006936

    object.attribute = value
    object.save(:validate => false)
    

    在函数中跳过验证

    要跳过函数更新:skip certain validation method in Model

    class User < ActiveRecord::Base
    
      validates :password, length: {minimum: 3, message: 'is too short, minimum of 3 characters'}, on: [:create, :update]
    , unless: :regenerate_recover_password
    ....
    end
    

    【讨论】:

    • 我不确定我是否理解(我是 Rails 初学者),因为我的方法中没有保存方法。查看完整的方法代码:zupimages.net/up/21/27/is02.png 类似:``` @user.recover_password = random_string_gen @user.save(validate: false) ... ```
    • 现在检查。也添加了。
    • 它进入一个无限循环,应用程序因此崩溃:/我不明白的是生成的字符串应该通过验证,如果我手动给它一个 4char 或更多的字符串就可以了
    【解决方案2】:

    我认为您可能会错误地解决问题 - 不要尝试限制每个控制器的验证,而是使用 if:unless: 选项来限制何时强制执行密码验证:

    class User < ApplicationRecord
      validates :password, 
        length: { 
          minimum: 3, 
          message: 'is too short, minimum of 3 characters' 
        }, 
        confirmation: true,
        if: :password_required?
    
      private
    
      def password_required?
        new_record? || reset_token_sent?
      end
    
      def reset_token_sent?
        # ... @todo implement
      end
    end
    

    请注意,这些不应与if/unless Ruby 关键字混淆。这些只是传递给方法的选项。

    【讨论】:

    • 附带说明 - 如果您是 Rails 的初学者,重新发明授权轮不是一个好主意,除非您将其作为一种学习体验。使用经过实战考验的解决方案,例如 Devise。
    • 感谢您的回答,确实我知道这不是一个好主意,这只是为了测试,我更喜欢自己尝试更好地理解,然后再完全不知道它的作用:)跨度>
    猜你喜欢
    • 1970-01-01
    • 2022-06-19
    • 2021-11-26
    • 1970-01-01
    • 2020-12-03
    • 2011-08-29
    • 1970-01-01
    • 2016-12-04
    • 2023-04-07
    相关资源
    最近更新 更多