2015-06-13 2 views
1

В настоящее время я пишу приложение в Ruby on Rails, которое извлекает данные (videoId в виде строки, заголовка в виде строки, эскиза в качестве строки и даты когда видео было создано как тип datetime) с YouTube и сохраняет его в базе данных.Rails: метод модели не выполняется как задача cron в разработке

Я уже тестировал API YouTube в чистом Ruby, и я знаю, что результат должен быть правильным, в частности, он должен вернуть все данные, о которых я упоминал ранее. Тем не менее, я не могу заставить его работать в Rails в качестве задания cron, использующего каждый раз при создании драгоценного камня.

Ниже у меня есть два метода, которые взаимодействуют с моей моделью. Один из них работает, а другой - нет. Тот, который не является self.create_youtube_posts, и тот, который делает, является методом проверки, который я создал, чтобы проверить, будет ли он выполняться как задание cron, используя каждый раз, когда gem (self.create_test_posts).

Проблема для меня, что я даже не вижу сообщений об ошибках с первым, код просто не выполняется. Если кто-то может объяснить мне, почему один метод работает, а другой нет, или просто подтолкнуть меня в правильном направлении, ваша помощь будет очень признательна. Обратите внимание, что это не вопрос о помощи в API YouTube, а скорее помощь с моим кодом Ruby.

приложение/модели/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 

Для дополнительной справки я включил мой файл schedule.rb, который я использую для создания хрон рабочих мест.

конфигурации/schedule.rb

every 1.day do 
    runner "Post.create_youtube_posts", :environment => :development 
end 
+0

что выход 'кронтаб -l' – Nithin

+0

' # Begin Когда сгенерированные задачи для: ytscrape 0 0 * * */bin/Баш -l -c 'кд/дом/кос/rails_projects/ytscrape && бен/рельсы бегун -e развитие '\'' Post.create_youtube_posts '\' '' # End Когда сгенерированные задачи для: ytscrape # Begin Всякий раз сгенерированные задачи для: /home/kos/rails_projects/ytscrape/config/schedule.rb 0 0 * * */bin/bash -l -c 'cd/h ome/kos/rails_projects/ytscrape && bin/rails runner -e development '\' Post.create_youtube_posts '\' '' # Конец Когда создаются задачи для:/home/kos/rails_projects/ytscrape/config/schedule.rb' –

+0

Я думаю, что мой cron работает нормально. Потому что, когда я запускаю его с помощью своего рабочего метода, все выглядит нормально. –

ответ

0

мне удалось решить мою проблему. И поскольку я ожидал, что проблема связана с моим кодом Ruby. Ниже приведены изменения, внесенные мной в файл post.rb. Я думаю, что мои переменные каким-то образом не прошли.

приложение/модели/post.rb --updated

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 
0

Вот список команд, которые могут помочь в отладке, если ваш CRON успешно выполняется в данный момент времени и периода.

grep CRON /var/log/syslog - проверить историю CRON запустить
bundle exec whenever or whenever -i - обновить кронтаб
crontab -l - см обновленный хрон (для всех пользователей)
crontab -e, for a specific user: crontab -e -u username - список пользователей задачу Cron в
crontab -r - удаляет ваши crontab из буферизатора cron, но не из файла 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

+0

Благодарим за отзыв. Мой cron работал нормально. Я ожидал, что это будет просто проблема с кодом Ruby. Я отправил свой ответ прямо ниже –

+0

Thats great .. (y) –

Смежные вопросы