我在我的控制器中有一个创建自定义qr的方法
def generate_qrcode()
require 'rqrcode'
qrcode = RQRCode::QRCode.new('ejemplo')
image = qrcode.as_png(
resize_gte_to: false,
resize_exactly_to: false,
fill: 'white',
color: 'black',
size: 120,
border_modules: 4,
module_px_size: 6,
file: nil # path to write
)
return image.resize(150, 150)
end
在我的主视图中,我编辑了一个li,重定向到我的 generate_qrcode()
index.html.erb
<p id="notice"><%= notice %></p>
<h1>Beneficios</h1>
<table>
<thead>
<tr>
<th>Id sucursal</th>
<th>Nombre</th>
<th>Estado</th>
<th>Descripcion</th>
<th>Tipo</th>
<th colspan="3"></th>
</tr>
</thead>
<tbody>
<% @beneficios.each do |beneficio| %>
<tr>
<td><%= beneficio.Id_sucursal %></td>
<td><%= beneficio.Nombre %></td>
<td><%= beneficio.Estado %></td>
<td><%= beneficio.Descripcion %></td>
<td><%= beneficio.Tipo %></td>
<td><%= link_to 'Show', beneficio %></td>
<td><%= link_to 'Edit', edit_beneficio_path(beneficio) %></td>
<td><%= link_to 'Destroy', beneficio, method: :delete, data: { confirm: 'Are you sure?' } %></td>
<td><%= link_to 'Qr', :controller => :beneficios, :action => :generate_qrcode %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%= link_to 'New Beneficio', new_beneficio_path %>
和我的路线
resources :beneficios do
collection do
get :generate_qrcode
end
end
然而,当我尝试生成qr时,我一直收到此错误消息
我搜索答案,但我找不到可以帮助我找出答案的东西。
答案 0 :(得分:1)
那是因为控制器要求你返回一个与动作同名的html模板。
您可以执行的操作是创建一个与操作同名的新视图( views / generate_qrcode.html.erb )。
将qr代码图像保存在实例变量中:
def generate_qrcode()
require 'rqrcode'
qrcode = RQRCode::QRCode.new('ejemplo')
image = qrcode.as_png(
resize_gte_to: false,
resize_exactly_to: false,
fill: 'white',
color: 'black',
size: 120,
border_modules: 4,
module_px_size: 6,
file: nil # path to write
)
@qr_code_img = image.resize(150, 150)
end
然后填充您创建的视图以显示qr代码图像:
<%= image_tag @qr_code_img %>
答案 1 :(得分:1)
要从控制器渲染原始二进制数据(例如图像),请使用send_data:
send_data(image.to_s, type: 'image/png', disposition: 'inline')
我建议您使用私有方法生成QR代码,然后从控制器操作中生成:
class BeneficiosController < ApplicationController
require 'rqrcode'
def generate_qrcode
qrcode = make_qrcode
send_data qrcode.to_s, type: 'image/png', disposition: 'inline'
end
private
def make_qrcode
qrcode = RQRCode::QRCode.new('ejemplo')
image = qrcode.as_png(
resize_gte_to: false,
resize_exactly_to: false,
fill: 'white',
color: 'black',
size: 120,
border_modules: 4,
module_px_size: 6,
file: nil # path to write
)
image.resize(150, 150)
end
end
答案 2 :(得分:0)
您无法在控制器中返回图像对象以进行渲染。您需要调用视图模板。在您的情况下,您可以将qrcode或image作为实例变量并将其传递给名为“template_qrcode”的模板。
由于您希望显示qr代码,因此在弹出窗口(如模态窗口)中显示它可能更加用户友好,而不是将用户重定向到其他页面。您可以在索引操作中生成所有qr代码模块,或使用Ajax按需生成它。