我仍在学习Rails,并且在我的应用程序中,我尝试实现当用户创建休假请求时发送给管理员的通知。我正在尝试跟进两个几乎相同的解决方案-Easy Notification System,它受Chris Olivier's navbar Notifications的启发,因此我始终处于起步阶段。当用户尝试创建休假请求时,我收到一条错误消息:
未定义的方法“ marked_for_destruction?”代表false:FalseClass
我尝试在控制器中定义此方法,但是,它没有用。
leave.rb模型:
class Leave < ApplicationRecord
after_create :create_notifications
belongs_to :user, optional: true
private
def recipients
[user.admin]
end
def create_notifications
recipients.each do |recipient|
Notification.create(recipient: recipient, actor: self.user,
action: 'posted', notifiable: self)
end
end
user.rb模型:
class User < ApplicationRecord
devise :invitable, :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :notifications, foreign_key: :recipient_id
has_many :leaves, dependent: :destroy
end
离开控制器:
def create
@leave = Leave.new(leave_params)
@user = User.new
if @leave.save
redirect_to leaves_path
else
render :new
end
end
我认为我必须将'autosave: true'
添加到has_many
中,
,它看起来应该像
has_many :leaves, dependent: :destroy, autosave: true
但它也不起作用。
欢迎任何提示。
答案 0 :(得分:0)
如果您look at the code of the presence validator,您会看到它遍历Enumerable
并在其元素上调用marked_for_destruction?
。
查看您的代码,这表明您要分配给关联的值之一是false
而不是您期望的ActiveRecord对象。
要调试此问题,建议您检出Pry和pry-byebug
gem:使用它可以在binding.pry
之前的行中添加断点(Notification.create
),然后检查recipient
和self.user
的值。
答案 1 :(得分:0)
如果我很了解您的通知系统,则您尝试在每次创建Leave
时向管理员发送通知。
假设,您的错误来自您的recipients
方法:
[user.admin]
返回[true]
或[false]
并且当您对其进行迭代时,您可以执行以下操作:Notification.create(recipient: true/false, ...)
您可以通过为管理员创建用户范围来修复系统:
class User < ApplicationRecord
#...
scope :admins, -> { where(admin: true) }
end
并更改recipients
方法,例如:
class Leave < ApplicationRecord
#...
private
def recipients
User.admins
end
def create_notifications
#...
end
end