Задача 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 вместо хранения данных в вашей кодовой базе (что почти всегда является плохой идеей).
Я хотел бы сесть с клиентом или кем-либо еще, кто составляет правила, и объяснить, что это будет довольно большой проблемой в будущем, и предложить решение, которое на самом деле приемлемо.