想要让页面每次显示不同的图像by Heroku

时间:2018-08-09 18:24:33

标签: ruby-on-rails heroku

<%=
require "mini_magick"
require 'rmagick'

first_image = MiniMagick::Image.new("#{Rails.root}/public/img/summon.png")
second_image = MiniMagick::Image.new("#{Rails.root}/public/img/(1).png")
result = first_image.composite(second_image) do |c|
    c.compose "Over"
    c.geometry "+20+20" 
end
result.write "output.jpg"

%>

大家好,我想让heroku每次在页面上显示不同的图像。 但是当我检查页面时,什么都没有,我不知道哪里出了问题,有人可以告诉我吗?

1 个答案:

答案 0 :(得分:0)

简短的答案是您的<%= %>块实际上不会生成任何要渲染的html。我相信您应该可以执行以下操作:

<%=
  require "mini_magick"
  require 'rmagick'

  first_image = MiniMagick::Image.new("#{Rails.root}/public/img/summon.png")
  second_image = MiniMagick::Image.new("#{Rails.root}/public/img/(1).png")
  result = first_image.composite(second_image) do |c|
      c.compose "Over"
      c.geometry "+20+20" 
  end
  result.write "output.jpg"
  image_url('output.jpg')
%>

并显示新图像。 (这是假定上面所有代码实际上都能正常工作。)您可能不得不摆弄image_url('output.jpg'),这取决于图像的写入位置。

但是,这很丑。这里有很多事情要解决。

首先,在我看来,您的require语句属于config/application.rb

然后,该代码的实质不在视图中,而是(至少)在控制器中。更好的是,它将属于服务。因此,假设您有:

#app/services/composite_image_service.rb

class CompositeImageService 

  attr_accessor *%w(
    args
  ).freeze

  class << self 

    def call(args={})
      new.call(args)
    end

  end # Class Methods

  #==============================================================================================
  # Instance Methods
  #==============================================================================================

    def initialize(args)
      @args = args
    end

    def call 

      first_image  = MiniMagick::Image.new("#{Rails.root}/public/img/summon.png")
      second_image = MiniMagick::Image.new("#{Rails.root}/public/img/(1).png")

      first_image.composite(second_image) do |c|
        c.compose "Over"
        c.geometry "+20+20" 
      end.write("output.jpg")

    end

end

现在,在您要生成新图像的控制器中,执行以下操作:

FooController < ApplicationController

  def some_action
    CompositeImageService.call 
  end

end

然后,在您的some_action视图中,执行以下操作:

<%= image_url 'output.jpg' %>

认为应该做到的。

现在:

  1. 您的看法再次变得愚蠢,应有的样子。
  2. 您的控制器无需了解有关操作方式的任何信息即可生成图像。所以,这也很愚蠢。也是应该的方式。
  3. 您的图像生成代码位于一个漂亮,干净的普通红宝石对象中,易于测试。