我正在尝试使用valid?
方法在我的模型中进行自定义验证。我需要运行此模型的所有验证,但密码除外。
这样的事情:
@resource = SalesPartner.new(permitted_params.merge(parent: current_sales_partner))
respond_to do |format|
if @resource.valid?(except: :password)
@resource.generate_authentication_token
SalesPartnerMailer.mail_new_sales_partner(@resource.email,
{ auth_token: @resource.authentication_token, id: @resource.id, level: @resource.level }
).deliver
flash[:success] = "#{@resource.level} criado com sucesso."
format.html { render "#{@path}/index" }
else
logger.log_and_alert_save_error(@resource, flash, "Ocorreu um erro ao salvar.")
format.html { render "#{@path}/new" }
end
end
这可能吗?
谢谢大家!
答案 0 :(得分:7)
这里的任何方式都可以借助 context 来完成。假设您有一个User
模型,并且您想验证某些字段。
validates_presence_of :name,: email, on: :special_context
validates_presence_of :name,:email, :password
使用以上两行,您现在可以执行以下操作
@user.valid?(:special_context)
以上内容将验证name
和email
字段。如果你现在写,
@user.valid?
这将在您编写的name
,email
和password
字段中执行状态验证。
阅读valid?(context = nil)
以了解上下文。
运行指定上下文中的所有验证。如果参数为
false
(默认为nil
),则如果:create
为真,则上下文设置为new_record?
,如果不是,则设置为:update
。无论上下文如何,都将运行没有
:on
选项的验证。使用某个:on
选项的验证只会在 指定的上下文 中运行。
将此documentation也视为官方示例。
答案 1 :(得分:2)
上下文可以真正帮助你,但也许不是。
validates_presence_of :name,: email, on: :special_context
validates_presence_of :name,:email, :password
这是因为当您使用validates_presence_of而未指定其上下文时,它将应用于所有上下文(无)。请参阅参考here所以,也许您可以尝试以下代码:
validates_presence_of :name, :email, on: :special_context
validates_presence_of :name, :email, :password, on: [ :create, :update]
答案 2 :(得分:0)
只是发现了另一种机制来跳过对指定上下文的验证,因为指定所有其他上下文并不总是合适的:
validates_presence_of :name, :email, on: :special_context
validates_presence_of :name, :email, :password, if: -> {Array(validation_context).exclude?(:special_context)}
注意:validation_context
可以是数组。