Задача Rake для создания партиала Rails из данных json

Прямо сейчас у меня есть помощник:

def blog_posts
  Rails.cache.fetch("blog_posts", :expires_in => 30.minutes) do
    url = URI('http://www.xxxxxxxx.com/blog/?json=get_recent_posts')
    request = Net::HTTP.get(url)
    response = JSON.parse(request)
    response['posts'].take(4)
  end
rescue => e
  logger.error "Error retrieving blog posts!"
  logger.error "#{e.message}\n#{e.backtrace.join("\n")}"
  []
end

И мнение у меня есть:

<% blog_posts.each do |blog| %>
  <div class="col col-3">
    <a class="search-page-links" href="<%= blog['url'] %>" target="_blank">
      <img class="post-image" src="<%= blog['thumbnail'] %>">
      <br/><br/>
      <%= blog['title'].html_safe %>
    </a>
  </div>
<% end %>

Который работает отлично. За исключением того, что мы не хотим, чтобы данные извлекались при загрузке страницы, потому что мы не всегда можем рассчитывать на источник. Планируется добавить задачу Rake в процесс развертывания, чтобы статические данные можно было обновлять в частичном рельсе при каждом развертывании, который будет отображаться в представлении. Как я мог сделать это?

2 ответа

Решение

Что я сделал

Rake Task:

namespace :blog do

  task :pull do
    tmp = "tmp/blog_posts"

    def fetch_blog_posts
      json = open('http://www.xxxxx.com/blog/?json=get_recent_posts').read
      hash = JSON.parse(json)
      hash['posts'].take(4)
    end

    def download_blog_images
      fetch_blog_posts.each_with_index do |blog, index|
        File.open("tmp/#{index}.jpg", 'wb') do |f|
          f.write open("#{blog['thumbnail']}").read
        end
        puts "Downloaded #{(index.to_i+1).ordinalize} Image" 
      end
    end

    def retrieve_blog_data
      puts 'Retrieving blog data from Wordpress'
      fetch_blog_posts

      File.open("tmp/blog_posts.json", "w+") do |f|
        f.write(JSON.pretty_generate(fetch_blog_posts))
        puts 'Saved json data'
      end
      download_blog_images
    end

    retrieve_blog_data
    puts 'Done retrieving blog posts'
  end

end

Helper:

module BlogHelper

  def blog_posts
    if Rails.env.development?
      json = open('http://xxxxx/blog/?json=get_recent_posts').read
    else
      json = File.read("tmp/blog_posts.json")
    end
    hash = JSON.parse(json)
    hash['posts'].take(4)
  end

end

контроллер:

def home
  @blog_posts = blog_posts
end

Посмотреть:

<% @blog_posts.each_with_index do |blog, index| %>
  # markup for each post...
<% end %>

Создание частичек просто звучит как наихудшее из возможных решений, потому что вы создаете огромное количество дублирующегося кода и, возможно, огромный слаг (развернутая база кода). Если вам необходимо сохранить данные JSON на диск и при необходимости использовать кэширование фрагментов.

Другими альтернативами будет использование ключа / значения или хранилища на основе JSON вместо хранения данных в вашей кодовой базе (что почти всегда является плохой идеей).

Я хотел бы сесть с клиентом или кем-либо еще, кто составляет правила, и объяснить, что это будет довольно большой проблемой в будущем, и предложить решение, которое на самом деле приемлемо.

Другие вопросы по тегам