通过条件验证属性存在

时间:2019-06-10 15:32:10

标签: ruby-on-rails validation if-statement model

我正在尝试在我的应用程序中引入一项功能,用户可以向组织者建议活动。要建议活动,用户必须填写表格。我想以条件为真来验证少数字段(事件的属性)的存在,即,如果用户(表单的提交者)不是管理员,则不应将这些字段留为空白。的形式是管理员,则字段可以保留为空白。

validates :attribute_name, presence: { :if => :user.is_admin? }

未定义的方法“ is_admin?” for:user:Symbol您的意思是? is_haml?

我也尝试过:user.is_admin()==True,它还会引发错误: :user:Symbol的未定义方法“ is_admin”是您的意思吗?是_a吗?

我在用户表中具有此属性:

t.boolean  "is_admin",               default: false

我在事件模型中定义了以下关联:

has_many :event_users, dependent: :destroy
  has_many :users, through: :event_users


  has_one :submitter_event_user, -> { where(event_role: 'submitter') }, class_name: 'EventUser'
  has_one  :submitter, through: :submitter_event_user, source: :user

在控制器中,我有以下代码:

@event.submitter = current_user

1 个答案:

答案 0 :(得分:4)

问题是您尝试在is_admin? Symbol上调用:user,因为错误提示。

如果我正确理解,应该存在此属性unless user.is_admin?返回true

这可以通过多种方式完成:

validates :attribute_name, presence: true, unless: -> {|u| u.is_admin?} 
#Or 
validates :attribute_name, presence: true, unless: :is_admin?
# or using presence directly as you tried to originally 
validates :attribute_name, presence: {unless: -> {|u| u.is_admin?} } 
# or 
validates :attribute_name, presence: {unless: :is_admin? } 

我通常更喜欢第一个选项,因为IMO模棱两可,可读性最强,但是所有这些都应该产生相同的功能,因此只要保持一致,就选择您喜欢的一个。

以块形式,实例屈服于该块,并且该块的返回值用于确定是否应运行验证。

使用符号时,符号会通过send消息传输(例如, self.send(:is_admin?再次使用返回值确定是否应应用验证

ActiveModel::Validations::ClassMethods#validates

更新基于修订后的问题:

由于Event通过Usersubmitter相关,并且已经设置为User的实例,因此可以通过非常相似的方式通过

validates :attribute_name, presence: true, 
    unless: ->(event) { event.submitter&.is_admin?} 

或制作一个单独的方法,例如

def admin_submitter? 
  self.submitter&.is_admin? 
end
validates :attribute_name, presence: {unless: :admin_submitter?}