如何从Rails中的模型调用控制器动作

时间:2018-12-14 04:48:19

标签: ruby-on-rails ruby model-view-controller

我有一个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方法也没有任何回报。

对于更好地解决此问题的任何帮助或建议,将不胜感激。

1 个答案:

答案 0 :(得分:1)

从模型内部调用控制器动作违反了MVC。模型动作应仅处理与数据相关的逻辑,所有动作应留在控制器内。

相反,您应该从控制器内部调用回调:

If a string of length zero is returned, the channel stream has closed.

您的模型将如下所示:

def writeall(sock):
    while True:
        data = sock.recv(256)
        if not data:
            sys.stdout.write("\r\n*** EOF ***\r\n\r\n")
            sys.stdout.flush()
            break
        sys.stdout.write(data)
        sys.stdout.flush()

writer = threading.Thread(target=writeall, args=(chan,))
writer.start()