【问题标题】:Rails trying to call controller method from consoleRails 试图从控制台调用控制器方法
【发布时间】:2015-02-06 16:24:02
【问题描述】:

我正在尝试使用when gem 创建一个cron 作业来向用户发送生日提醒,我希望这个cron 每天都运行。

我可以随时运行 gem,但我的 cron 工作不断出错。我试图在 Rails 控制台中调用控制器方法来解决这个问题,但我不断收到错误,我不确定为什么。

我有这个控制器:

class BirthdayRemindersController < ApplicationController

    include ApplicationHelper

    # cron job that sends birthday reminders
    def send_birthday_email_reminders 
        users = User.all

        email_addresses = []

        users.each_with_index do |user, i|
            if user.user_details.birthday_reminders == true
                email_addresses[i] = get_primary_email(user)
            end
        end

        p email_addresses

        users.each do |user|
            if user.user_details.birthday == Date.today
                p "reminder sent"
                send_birthday_reminders(user, email_addresses)      
            end
        end
    end
end

在 Rails 控制台中,我已经尝试了这两种方法,但它们都出错了。

Toms-Mac-mini:famnfo TomCaflisch$ rails c
Loading development environment (Rails 3.2.9)
irb(main):001:0> BirthdayRemindersController.send_birthday_email_reminders
NoMethodError: undefined method `send_birthday_email_reminders' for BirthdayRemindersController:Class
        from (irb):1
        from /Users/TomCaflisch/.rvm/gems/ruby-1.9.3-p327@famnfo/gems/railties-3.2.9/lib/rails/commands/console.rb:47:in `start'
        from /Users/TomCaflisch/.rvm/gems/ruby-1.9.3-p327@famnfo/gems/railties-3.2.9/lib/rails/commands/console.rb:8:in `start'
        from /Users/TomCaflisch/.rvm/gems/ruby-1.9.3-p327@famnfo/gems/railties-3.2.9/lib/rails/commands.rb:41:in `<top (required)>'
        from script/rails:6:in `require'
        from script/rails:6:in `<main>'
irb(main):002:0> BirthdayReminders.send_birthday_email_reminders
NameError: uninitialized constant BirthdayReminders
        from (irb):2
        from /Users/TomCaflisch/.rvm/gems/ruby-1.9.3-p327@famnfo/gems/railties-3.2.9/lib/rails/commands/console.rb:47:in `start'
        from /Users/TomCaflisch/.rvm/gems/ruby-1.9.3-p327@famnfo/gems/railties-3.2.9/lib/rails/commands/console.rb:8:in `start'
        from /Users/TomCaflisch/.rvm/gems/ruby-1.9.3-p327@famnfo/gems/railties-3.2.9/lib/rails/commands.rb:41:in `<top (required)>'
        from script/rails:6:in `require'
        from script/rails:6:in `<main>'
irb(main):003:0> 

我错过了什么?我没有为此控制器定义路由,因为我不希望任何人能够通过网络浏览器访问它

【问题讨论】:

  • 我知道如何从控制台调用控制器,因为我正在这样做。我只是在调用特定方法时遇到错误,不知道为什么。
  • Yves Senn 指出:您正在调用该方法,就好像它是一个类方法(用self 声明),但它是一个实例方法。你可以尝试像 BirthdayRemindersController.new.send_birthday_email_reminders 那样调用它,但它肯定会产生错误,因为 Controller 缺少上下文。

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

控制器上的方法是实例方法,而不是类方法。类方法用self. 定义。很难从控制台触发控制器操作,因为您错过了整个上下文。您没有会话,没有请求,没有响应。所有这些都使得在控制器操作中使用代码变得很困难。如果您需要从外部触发您的代码(控制台、机架任务、其他代码)。您应该将代码提取到它自己的类中。

【讨论】:

  • 你能举个例子吗?这将进入哪个文件夹?我只是不扩展 ApplicationController 吗?
  • 从第一次阅读你的问题就很清楚,我需要做的就是将self. 添加到方法中。在网上看了一些东西后,我现在想通了。
【解决方案2】:
  1. 使用“调试器”gem。
  2. 在您的控制器方法中添加一个调试器,然后在您使用调试器模式运行应用程序后在控制台中使用它 -> "rails s --debugger"

【讨论】:

    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2014-07-29
    • 1970-01-01
    相关资源
    最近更新 更多