“ marked_for_destruction?”代表false:FalseClass

时间:2018-10-20 21:30:30

标签: ruby-on-rails

我仍在学习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

但它也不起作用。

欢迎任何提示。

2 个答案:

答案 0 :(得分:0)

如果您look at the code of the presence validator,您会看到它遍历Enumerable并在其元素上调用marked_for_destruction?

查看您的代码,这表明您要分配给关联的值之一是false而不是您期望的ActiveRecord对象。

要调试此问题,建议您检出Prypry-byebug gem:使用它可以在binding.pry之前的行中添加断点(Notification.create),然后检查recipientself.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