我正在尝试在我的应用程序中引入一项功能,用户可以向组织者建议活动。要建议活动,用户必须填写表格。我想以条件为真来验证少数字段(事件的属性)的存在,即,如果用户(表单的提交者)不是管理员,则不应将这些字段留为空白。的形式是管理员,则字段可以保留为空白。
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
答案 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
通过User
与submitter
相关,并且已经设置为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?}