Rails 4 - 在单个列上“验证”

时间:2016-02-16 10:06:49

标签: ruby-on-rails

我想在更新记录之前进行验证。 仅当单个列的值发生更改时,才会触发验证。

  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]

2 个答案:

答案 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代码。只有当字符串表示非常短的条件时,才应使用此选项。

作为旁注,您应该查看授权,尤其是CanCanCanPundit

#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 %>

虽然不是验证的替代品,但它将使您能够管理流程,以便只有经理才能使用它。