Rails试图从控制台调用控制器方法

时间:2013-01-05 14:00:50

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

我尝试使用随时随地创建一个cron作业向用户发送生日提醒,我希望每天都能运行这个cron。

我有任何宝石工作,但我的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> 

我缺少什么?我没有为此控制器定义路线,因为我不希望任何人能够通过网络眉毛击中它

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

  1. 使用&#39;调试器&#39;宝石。
  2. 使用 - &gt;在调试器模式下运行应用程序后,在控制器方法中添加调试器,然后在控制台中使用它。 &#34; rails s --debugger&#34;