Rails基于Params的电子邮件验证

时间:2015-12-14 19:11:40

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

我有两个注册表单:一个可以注册任何电子邮件地址,另一个只注册一个特定域名。如何从 User.rb 模型中允许它?

这样的事情可能有用:

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

但是因为我有两个注册表单,并且该表单的网址ID为2:

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

我确实理解params在模型中不可用,但基于我想要实现的目标,如何实现这一目标?

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

2 个答案:

答案 0 :(得分:1)

您可以向模型添加一个属性,该属性可以指示哪个表单注册来自: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。

答案 1 :(得分:1)

这听起来非常适合验证上下文。 validates*方法可以接受:on选项,该选项是将在其中触发验证的“上下文”的名称;例如:

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

仅当选项context: :restricted_email传递给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/