【问题标题】:Rails: Calling a controller method from another controller -> NoMethodErrorRails:从另一个控制器调用控制器方法-> NoMethodError
【发布时间】:2012-10-16 15:36:02
【问题描述】:

我正在使用 Devise gem 并拥有 2 个控制器:

1:控制器/admin/mailings_controller.rb:

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

2:控制器/registrations_controller.rb:

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

但是当我执行(在控制台中)...

Admin::MailingsController.send_emails

...我明白了...

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

为什么?以及如何解决这个问题?

rake routes

...显示没有问题:

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

【问题讨论】:

  • 试试RegistrationsController.new.create.. 虽然看起来你正在尝试做的事情并不正确。您要重定向吗?
  • 或者修改你的创建函数:def create -> def self.create,它会让你的函数静态并且可以通过类名调用
  • 控制器方法不是简单的方法而是actions,意思是响应http请求。不要将控制器视为包含一些代码的通常 ruby​​ 模块/类。将要从多个控制器调用的代码保存在单独的模块中,并将该模块包含在所有这些控制器中。并调用模块方法
  • 不,我不是在尝试重定向,只是为了重用 Devise gem 中现有代码的一部分。并且“send_mails”方法只能使用1次(在启动时),所以我想这样做是可以的。谢谢大家的帮助 - 第一个作为回复发布的人会被接受......

标签: ruby-on-rails devise controller nomethoderror


【解决方案1】:

RegistrationsController.create 更改为RegistrationsController.new.create

def create 更改为def self.create

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

【讨论】:

  • 请记住,当您这样做时,请求不会出现在 RegistrationsController 中。
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 2011-08-11
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
相关资源
最近更新 更多