У меня есть приложение rails, в котором я пытаюсь использовать файл модели, который находит @ mentions в текстовом поле, а затем я хочу, чтобы оно уведомляло сторону @mentioned, используя обратный вызов after_create
class Post < ApplicationRecord
after_create :notifiy_users
def notifiy_users
mentioned_users.each do |user|
Notification.create!(recipient: user,
actor: self.user,
action: 'mentioned',
notifiable: self)
end
end
def mentions
@mentions ||= begin
regex = /@([\w]+)/
matches = body.scan(regex).flatten
end
end
def mentioned_users
@mentioned_users ||= User.where(username: mentions)
end
end
на local_env это работает, и уведомление создается и сохраняется, но когда я нажимаю на продакшн, это действует так, как будто after_create никогда не вызывается, и я не получаю возврата от метода notify_users.
Мы будем очень благодарны за любую помощь или рекомендации по лучшему способу решения этой проблемы.
где вы хотите вызвать действие контроллера из модели ??
Вызов действия контроллера из модели - плохая идея. Почему вы хотите это сделать?





Вызов действий контроллера изнутри модели нарушает MVC. Действия модели должны обрабатывать только логику, связанную с данными, все действия должны оставаться в пределах контроллера.
Вместо этого вы должны вызывать обратный вызов из своего контроллера:
class PostController < ApplicationController
after_action :notify_users, only: [:create]
...
def notify_users
@post.mentioned_users.each do |user|
Notification.create!(recipient: user,
actor: @post.user,
action: 'mentioned',
notifiable: self)
end
end
end
И ваша модель будет выглядеть так:
class Post < ApplicationRecord
def mentions
@mentions ||= begin
regex = /@([\w]+)/
matches = self.body.scan(regex).flatten
end
end
def mentioned_users
@mentioned_users ||= User.where(username: self.mentions)
end
end
в производстве, скорее всего, ваш
mentioned_usersпуст.