在控制器外部渲染视图时,我试图让 link_to 工作。我尝试了在互联网上找到的几种不同的解决方案。您可以看到已注释掉一项尝试。
它不断导致: nil:NilClass 的未定义方法`host'
ac = ApplicationController.new
ac.class.include Rails.application.routes.url_helpers
#context = Rails.configuration.paths['app/views']
#view = ActionView::Base.new(context)
#view.class.include Rails.application.routes.url_helpers
#view.render :layout => 'layouts/pdf.html.haml', :template => 'reports/show.pdf.haml', locals: {alerts:@alerts}
ac.render_to_string(:layout => 'layouts/pdf.html.haml', :template => 'reports/show.pdf.haml', locals: {alerts:@alerts})
Run Code Online (Sandbox Code Playgroud)
我也试过骑过课。ActionView::Base 的东西似乎都不起作用。
class ViewRenderer < ActionView::Base
include Rails.application.routes.url_helpers
include ApplicationHelper
def default_url_options
{host: Rails.application.routes.default_url_options[:host]}
end
end
Run Code Online (Sandbox Code Playgroud)
小智 1
虽然这个问题已经有 4 年历史了,但我回答了一个类似的问题,我认为可以在这里提供帮助。
一种选择是直接将 URL 帮助程序包含在locals
传递给模板的内容中:
ac.render_to_string(
layout: 'layouts/pdf.html.haml',
template: 'reports/show.pdf.haml',
locals: {url: Rails.application.routes.url_helpers, alerts: @alerts}
)
Run Code Online (Sandbox Code Playgroud)
然后在模板内部,您可以使用显式设置的主机来调用它们:
url.user_url(host: 'www.mysite.com')
Run Code Online (Sandbox Code Playgroud)
或者您可以为整个应用程序全局配置主机:
# config/environments/development.rb
Rails.application.routes.default_url_options[:host] = 'www.mysite.com'
Run Code Online (Sandbox Code Playgroud)