是否可以在给定的控制器和操作上运行ActiveRecord验证。
例如,我有user_controller
和signup_controller
我只需要在signup_controller #create action
上运行密码必需的验证答案 0 :(得分:18)
您可以使用if
条件运行验证:
validates :email, presence: true, if: :validate_email?
现在您需要定义此实例方法(在您的模型中):
def validate_email?
validate_email == 'true' || validate_email == true
end
此validate_email
属性可以是模型中的虚拟属性:
attr_accessor :validate_email
现在,您可以根据该虚拟属性执行电子邮件验证。例如,在signup_controller#create
中,您可以执行以下操作:
def create
...
@user.validate_email = true
@user.save
...
end
答案 1 :(得分:1)
在user.rb中使用validates :password, :if => :password_changed?
如果users_controller中的表单未提交password
字段,那么您应该没问题。
答案 2 :(得分:1)
只是实施@markets答案的提示
我们可以使用
with_options if: :validate_email? do |z|
z.validates :email, presence: true
z.validates :name, presence: true
end
对我们的具体行动进行多次验证。
另外,我们使用session来传递一个变量,该变量表明这个动作的参数需要一些验证
<强>控制器:强>
before_action :no_validate, only: [:first_action, :second_action, ..]
before_action :action_based_validation, only: [:first_action, :second_action, ..]
def first_action; end
def second_action; end
def update
..
@instance.validate = session[:validate]
..
if @instance.update(instance_params)
..
end
end
private
def no_validate
session[:validate] = nil
end
def action_based_validation
# action_name in first_action will = "first_action"
session[:validate] = action_name
end
<强>模型强>
attr_accessor :validate
with_options if: "validate == 'first_action'" do |z|
z.validates :email, presence: true
..more validations..
end
with_options if: "validate == 'second_action'" do |z|
z.validates :name, presence: true
..more validations..
end
更多细节: http://guides.rubyonrails.org/active_record_validations.html#conditional-validation