Rails:模型方法在开发中不作为 cron 任务执行



我目前正在用Ruby on Rails编写一个应用程序,该应用程序从YouTube获取数据(videoId为字符串,标题为字符串,缩略图URL为字符串,视频创建日期为日期时间类型)并将其保存到数据库中。

我之前在纯Ruby中测试过YouTube API,我知道输出应该是正确的,特别是它应该返回我之前提到的所有数据。但是,我似乎无法让它在 Rails 中作为 cron 工作使用 gem。

下面我有两个与我的模型交互的方法。其中一个有效,另一个无效。没有的那个是self.create_youtube_posts的,而那个是我创建的测试方法,用于检查它是否使用 whengem (self.create_test_posts 作为 cron 作业执行。

对我来说,问题是我什至没有看到第一个错误消息,代码根本无法执行。如果有人能向我解释为什么一种方法有效而另一种方法无效,或者只是简单地将我推向正确的方向,您的帮助将不胜感激。请注意,这不是一个在YouTube API上寻求帮助的问题,而是帮助我的Ruby代码。

app/models/post.rb

class Post < ActiveRecord::Base
    # This method is not working!
    def self.create_youtube_posts
        require 'faraday'
        require 'rubygems'
        require 'google/api_client'
        require 'trollop'
        developer_key = "MY_API_KEY_GOES_HERE"
        youtube_api_service_name = "youtube"
        youtube_api_version = "v3"
        opts = Trollop::options do
          opt :maxResults, 'Max results', :type => :int, :default => 18
          opt :order, 'Order', :type => String, :default => 'viewCount' 
          opt :publishedAfter, 'Date', :default => (Time.now - 1.day).to_datetime
        end
        client = Google::APIClient.new(:key => developer_key,
                               :authorization => nil)
        youtube = client.discovered_api(youtube_api_service_name, youtube_api_version)
        # Call the search.list method to retrieve results matching the specified
        # query term.
        opts[:part] = 'id,snippet'
        search_response = client.execute!(:api_method => youtube.search.list,
                                          :parameters => opts)
        search_response.data.items.each do |search_result|
            case search_result.id.kind
                when 'youtube#video'
                    # vi is short for videoId
                    vi = '<iframe width="425" height="349" src="http://www.youtube.com/embed/'
                       + "#{search_result.id.videoId}" 
                       + '" frameborder="0" allowfullscreen></iframe>'
                    # t is short for title
                    t = "#{search_result.snippet.title}"
                    # tn is short for thumbnail
                    tn = "#{search_result.snippet.thumbnails.high.url}"
                    # dt is short for datetime
                    dt = "#{search_result.snippet.publishedAt}"
                    @post = Post.new(videoid: vi, 
                                 title: t, 
                                 thumbnail: tn, 
                                 date: dt)
                    @post.save                  
            end
        end
    end
    # This method is working fine!
    def self.create_test_posts
        @test_post = Post.new(videoid: "Sample video id", 
                              title: "Sample Title", 
                              thumbnail: "Sample Thumbnail", 
                              date: (Time.now).to_datetime)
        @test_post.save
    end
end

为了获得额外的参考,我包含了我用来生成 cron 作业的 schedule.rb 文件。

config/schedule.rb

every 1.day do
    runner "Post.create_youtube_posts", :environment => :development
end
下面是可以帮助您

调试 CRON 是否在给定时间和时间段成功执行的命令列表。

grep CRON /var/log/syslog -- 检查 CRON 运行的
历史记录 bundle exec whenever or whenever -i -- 更新 crontab
crontab -l -- 查看更新的 cron(适用于所有用户)
crontab -e, for a specific user: crontab -e -u username -- 列出用户 cron 的任务
crontab -r -- 从 cron 后台处理程序中删除您的 crontab 条目,但不从 crontab 文件中删除。

仅供参考:
Minute Hour Day of Month Month Day of Week User Command
(0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat)
0 2 * * * root /usr/bin/find

我已经设法解决了我的问题。正如我所料,问题出在我的Ruby代码上。以下是我在post.rb文件中所做的更改。我认为我的变量不知何故没有通过。

app/models/post.rb --更新

search_response.data.items.each do |search_result|
    case search_result.id.kind
        when 'youtube#video'
            post = Post.new(videoid: "#{search_result.id.videoId}", 
                            title: "#{search_result.snippet.title}", 
                            thumbnail: "#{search_result.snippet.thumbnails.high.url}", 
                            date: "#{search_result.snippet.publishedAt}")
            post.save                   
    end
end

相关内容

  • 没有找到相关文章

最新更新