我正在尝试在我的应用程序中引入一个功能,其中用户可以向organizers.To建议一个事件,建议一个用户必须填写表单的事件。我想验证一些字段(事件的属性)的存在与条件为真,即字段不应留空,如果用户(表单的提交者)不是admin.However如果表单的提交者是管理员,字段可以留空。
validates :attribute_name, presence: { :if => :user.is_admin? }
未定义的方法`is_admin?‘for :user:Symbol您的意思是?is_haml?
我也尝试过:user.is_admin()==True
,它也抛出了错误:未定义的方法`is_admin‘for :user:Symbol你的意思是什么?is_a?
我在users表中有以下属性:
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
发布于 2019-06-10 15:59:12
问题是您正在尝试调用Symbol
:user
上的is_admin?
,正如错误所暗示的那样。
如果我没理解错的话,这个属性应该存在,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
通过submitter
与User
相关,并且已经设置为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?}
https://stackoverflow.com/questions/56529363
复制