我想在更新记录之前进行验证。 仅当单个列的值发生更改时,才会触发验证。
def manage_only_subordinates_schedules
current_user = User.current
if !current_user.manager_of(self.created_by,true)
self.errors.add(:base, "Vous ne pouvez pas verrouiller une programmation qui a été vérouillée par un utilisateur de grade supérieur")
return false
end
end
private :manage_only_subordinates_schedules
validate :manage_only_subordinates_schedules, :on => :update
我们有什么方法可以做这样的事情吗?
validate :manage_only_subordinates_schedules, :on => :update, :columns => [:locked]
答案 0 :(得分:1)
您可能想查看this。假设您有一个Book
模型,并希望在title
更改后进行验证:
validate :call_this_method, if: :title_changed?
答案 1 :(得分:0)
Votre codedevraitêtre:
#app/models/model.rb
class Model < ActiveRecord::Base
validate :manage_only_subordinates_schedules, on: :update, if: "locked.changed?"
private
def manage_only_subordinates_schedules
current_user = User.current
self.errors.add(:base, "Vous ne pouvez pas verrouiller une programmation qui a été vérouillée par un utilisateur de grade supérieur") unless current_user.manager_of(self.created_by,true)
end
end
Regarde Using a string with if
and unless
您还可以使用将使用eval进行评估的字符串,并且需要包含有效的Ruby代码。只有当字符串表示非常短的条件时,才应使用此选项。
作为旁注,您应该查看授权,尤其是CanCanCan
或Pundit
:
#Gemfile
gem "cancancan"
#app/models/ability.rb
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
can :manage, Model do |model|
user.manager_of(model.created_by, true)
end
end
end
#app/views/models/show.html.erb
<% # do something if can? :manage, Model %>
虽然不是验证的替代品,但它将使您能够管理流程,以便只有经理才能使用它。