我有两个注册表单:一个可以注册任何电子邮件地址,另一个只注册一个特定域名。如何从 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
电子邮件地址(域名)注册。
答案 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
传递给save
或save!
方法时,才会触发此验证。以下是您在控制器中使用它的方法:
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/