Criação de imagens de JSON no Rails

Em um projeto recente, fui solicitado a gerar imagens dinamicamente que
mostrassem os eventos programados em uma sala. Os dados do evento são armazenados em
um sistema externo que eu poderia obter

Uma pequena pesquisa no
Google encontrou IMGKit , que envolve o programa
wkhtmltoimage .

Eu criei um pequeno aplicativo Rails que tinha apenas uma rota
/ sala / [room_id] / eventos. E eu limitei o controlador de eventos a apenas uma
ação ,: índice. Então eu defini uma visão /events/index.jpg.erb

<% events.each do |event| %>
<%= event.description %>
<% end %>

Na ação de índice do evento #, a criação da imagem foi tratada com

def index
...
kit
= IMGKit.new(render_to_string, width: 480, height: 800, :quality => 100)
...
respond_to
do |format|
format
.jpg do
send_data
(kit.to_jpg, :type => "image/jpeg", :disposition => 'inline')
end
end
end

No entanto, isso é algo que você pode aprender no readme do IMGKit. Nada muito
excitante aí. Mas encontrei mais alguns problemas que podem ser de
interesse.

Primeiro: render_to_stringrenderiza apenas o código do template da ação,
não usará o arquivo de layout do controlador, ou o
arquivo application.html.erb . Mesmo se você passar a bandeira certa:

render_to_string(:layout => true)

Eu não conseguia fazer isso funcionar. Portanto, se você tiver arquivos CSS ou
estrutura HTML de que precisa em sua visualização, terá que colocá-los dentro do
arquivo erb da ação. Então, meu código no arquivo acabou parecendo com:/app/views/events/index.jpg.erb

<!DOCTYPE html>
<html>
<head>
<title>Amxtest</title>
<style type='text/css'>
html {

...

}

/* etc */

</head>
<body>
...

</body>
</html>

Observe também que os links para arquivos usando image_tagou stylesheet_tag
não funcionam da maneira que você espera. Links relativos parecem não funcionar,
com ou sem Rails.root.

Resolvi isso definindo a constante IMG_ROOT específica do ambiente. Portanto, para o
desenvolvimento, está definido como e, quando preciso mostrar uma imagem na minha visualização, eu a salvo no diretório / public / images e vinculo a ele com:http://localhost:3000/

<%= image_tag("#{IMG_ROOT}/images/image_name.jpg") %>

Um hack feio, mas resolveu meu problema.

Esse problema de vinculação também significa que você não pode incluir facilmente um arquivo CSS em
sua visualização. Você provavelmente poderia consertar da mesma maneira que
consertei imagens, mas o IMGKit oferece este código que você pode usar dentro do controlador:

kit = IMGKit.new(render_to_string, width: 480, height: 800, :quality => 100)
css
= File.open("#{Rails.root}/app/assets/stylesheets/images.css")
kit
.stylesheets << css

Por último, a criação de imagens pode levar alguns segundos, especialmente se
você estiver extraindo dados de um serviço de terceiros. Portanto, você provavelmente desejará
examinar o cache. Esse é um outro tópico, no entanto.