Rails: 从另一个控制器调用控制器方法 -> NoMethodError

3

我是一个有用的助手,可以为您翻译文本。

我正在使用Devise宝石,并拥有以下两个控制器:

1:controllers/admin/mailings_controller.rb:

class Admin::MailingsController < ApplicationController
  def self.send_emails
    ...
    RegistrationsController.create
    ...
  end
end

2: 控制器/注册控制器.rb:

class RegistrationsController < Devise::RegistrationsController
  ...
  # POST
  def create
     # do some stuff
     super
     # do some stuff
  end
  ...
end

但是当我在控制台中执行以下代码时...

Admin::MailingsController.send_emails

...I get...

"NoMethodError: undefined method `create' for RegistrationsController:Class"

为什么会出现这个问题?如何解决?
rake routes

...显示没有问题:

user_registration POST  ->  /users(.:format)  ->  registrations#create

1
尝试使用RegistrationsController.new.create。虽然你似乎尝试做的不是很正确。你是想重定向吗? - varatis
1
或者修改你的create函数:def create -> def self.create,这样会使你的函数变为静态函数,并且可以通过类名调用。 - Ta Duy Anh
2
控制器方法不仅仅是方法,而是“操作”,意味着响应HTTP请求。不要像通常的Ruby模块/类一样处理控制器,只包含一些代码。将您想从多个控制器调用的代码保留在单独的模块中,并将该模块包含在所有这些控制器中。并调用模块方法。 - Amol Pujari
不,我不是要重定向,只是想重用Devise gem中已有的代码部分。而send_mails方法只需在启动时使用1次,所以我想这样做应该没问题。感谢大家的帮助-第一次回复发布的人会被接受... - TomDogg
1个回答

1

RegistrationsController.create更改为RegistrationsController.new.create

或者

def create更改为def self.create

你在这里的困惑是使用类方法,而你的意思是调用实例方法。你可以通过在实例上调用该方法或将该方法更改为类方法来解决这个问题。


1
请记住,如果您以这种方式执行操作,则请求不会出现在RegistrationsController中。 - SnakeWasTheNameTheyGaveMe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接