【问题标题】:Rails Email Validation Based on Params基于参数的 Rails 电子邮件验证
【发布时间】:2015-12-14 19:11:39
【问题描述】:

我有两种注册表单:一种可以使用任何电子邮件地址注册,另一种只能使用一个特定域进行注册。如何从 User.rb 模型中允许这样做?

这样的事情可能会奏效:

validates_format_of :email, :with => /.io/

但是因为我有两个注册表单,并且该表单的 url 的 id 为 2:

validates_format_of :email, :with => /.io/ if params[id] == 2

我知道params 在模型中不可用,但基于我想要实现的目标,如何实现?

基本上id = 1的表格可以用任何邮箱注册。带有id = 2 的表单只能使用.io 电子邮件地址(域)注册。

【问题讨论】:

    标签: ruby-on-rails validation ruby-on-rails-4 devise


    【解决方案1】:

    这听起来对验证上下文很有用。 validates* 方法可以接受 :on 选项,这是将触发验证的“上下文”的名称;例如:

    validates_format_of :email, :with => /\.io\z/, on: :restricted_email
    

    如果选项@ 987654327传递到savesave!方法,则验证只会触发。以下是您在控制器中使用它的方法:

    def create
      @user = User.new(params[:user])
    
      if params[:id] == 2
        @user.save!(context: :restricted_email)
      else
        @user.save!
      end
    end
    

    这是一篇关于该主题的好博文:http://blog.arkency.com/2014/04/mastering-rails-validations-contexts/

    【讨论】:

    • 错误:The provided regular expression is using multiline anchors (^ or $), which may present a security risk. Did you mean to use \A and \z, or forgot to add the :multiline => true option?
    • 乔丹,最后一个问题。使用您的代码,如何轻松地将更多域添加到正则表达式?
    • 用正则表达式表示域名非常容易,例如/\.(com|edu|io|co\.uk)\z/.
    • 在 Ruby 中使用正则表达式的一种简单方法是 Rubular.com:rubular.com/r/QNgfdyo9sH
    【解决方案2】:

    您可以向模型添加一个属性,指示来自哪个表单注册,例如:registered_io,通过表单中的隐藏字段发送到您的模型

    #...
    <%= f.hidden_field :registered_io, value="true" # or false %> 
    

    然后在你的模型中你可以做一个

    validates :format_of_io_email_should if self.registered_io 
    validates :format_of_universal_email_should if !self.registered_io
    
    def format_of_io_email_should
     # regex ahoy or whatever
    end
    def format_of_universal_email_should
    # same same but different
    end
    

    不要忘记运行迁移来存储属性!

    $ rails migration add_column_registered_io_to_user registered_io:boolean 
    

    另外不要忘记在控制器的强参数中允许 :registered_io。

    【讨论】:

    • 在我看来,这是更好的选择。无论您有什么标准将用户限制为.io 电子邮件地址,您可能都希望在创建用户后维护该上下文。否则,您将无法知道具有.io 电子邮件地址的现有用户是否属于给定组。
    • 我从模特那里得到undefined method for registered_to
    • registered_toregistered_io?前往$ rails console 进行查看。
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2011-06-14
    • 1970-01-01
    • 2011-01-26
    • 2013-08-24
    • 2014-02-06
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多