【问题标题】:Rake task to create a Rails partial from json data从 json 数据创建 Rails 部分的 Rake 任务
【发布时间】:2016-02-08 17:02:40
【问题描述】:

现在我有一个帮手:

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 任务,以便可以在每次部署时在 Rails 部分中更新静态数据,并将其呈现到视图中。我该怎么做呢?

【问题讨论】:

  • 我建议您将获取的数据存储在数据库中。每次要更新此视图时都更新应用程序代码库似乎很痛苦。
  • 假设数据库现在不是一个选项(不是“我的”应用程序,不是我的规则那种情况)。我们每天部署,这部分实际上只会每周更改一次,因为“最近的帖子”并不频繁。所以我们不会部署更新部分。相反,当我们部署时,如果碰巧有帖子的更改/更新,我们希望部分更新

标签: ruby-on-rails ruby json rake


【解决方案1】:

创建partials 听起来像是最糟糕的解决方案,因为您正在创建大量的代码重复,并且可能是一个巨大的slug(已部署的代码库)。如果您必须将 JSON 数据保存到磁盘并在需要时使用片段缓存。

其他替代方法是使用基于键/值或 JSON 的存储,而不是将数据存储在代码库中(这几乎总是一个坏主意)。

我会与客户或制定规则的人坐下来,解释这将是一个相当大的维护问题,并提出一个实际上可行的解决方案。

【讨论】:

  • 谢谢你的建议,我完全同意你的看法。但是,我的问题仍然没有答案。即使我选择采取其他几种更明智的方法之一,问题仍然存在。我想知道如何做到这一点。如果我们假装今天是一个假期,我们应该想办法以不应该做的方式做事,而我认为这是我参与假期,这有帮助吗?因为我正在寻找我实际问题的答案。
  • 嗯,它可能涉及渲染一个包含数据的主视图并将生成的 HTML 写入磁盘。您可能想查看rspec-rails 如何在视图规范中单独渲染视图(和部分视图)。然后你需要对任何指向部分的模板链接做同样的事情。
  • 它可能需要 10 倍于像一个理智的人那样做。但是,嘿 - 这是你的假期。
  • 酷我调查 rspec-rails 看看里面发生了什么。如果世界在我周围崩溃和燃烧,我至少能够交付对我的要求并展示“为什么”和“为什么不”。节日快乐! :)
【解决方案2】:

我做了什么

耙任务:

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

助手:

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 %>

【讨论】:

    猜你喜欢
    • 2013-09-14
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2013-09-03
    相关资源
    最近更新 更多