6

我必须渲染一些模板并将 HTML 块发送到 SendGrid 以进行电子邮件替换。所以,不幸的是,我正在像这样的模型中进行一些渲染:

    view = ActionView::Base.new(Rails.configuration.paths["app/views"].first)
    view.render(:partial => template_name)

即使我添加了:

    view.extend Rails.application.routes.url_helpers
    view.extend ActionView::Helpers::UrlHelper
    view.extend ApplicationHelper

除非我像下面这样明确定义模块,否则部分无法访问像 url_for 这样的 URL 助手:

    Rails.application.routes.url_helpers.edit_user_url(user, :host => Rails.application.config.action_mailer.default_url_options[:host])

有没有更简洁的方法在从模型调用的模板中使用 URL Helper?

4

4 回答 4

2

Rails 5中,这很简单:

ApplicationController.render partial: 'my/partial'

它将加载您所有的助手

更多信息:https ://eilmartians.com/chronicles/new-feature-in-rails-5-render-views-outside-of-actions

于 2018-04-23T21:36:15.143 回答
1

我发现的一种解决方法是通过url_helpers作为的一部分locals

url = Rails.application.routes.url_helpers
view = ActionView::Base.new(Rails.configuration.paths['app/views'].first)
view.render(partial: template, locals: locals.merge(url: url))

然后在视图中:

<%= url.thing_path %>

另请注意,您必须配置您default_url_options的:

# config/environments/production.rb
  config.after_initialize do
    Rails.application.routes.default_url_options = { host: 'production.server.com' }
  end

# config/environments/development.rb
  config.after_initialize do
    Rails.application.routes.default_url_options = { host: 'localhost', port: 3000 }
  end
于 2017-05-12T03:30:32.527 回答
0

这是我的解决方案

options = Rails.configuration.action_mailer.default_url_options
view = ApplicationController.renderer.new(http_host: "#{options[:host]}:#{options[:port]}")
view.class_eval do       
  include Rails.application.routes.url_helpers
  include ApplicationHelper

  def protect_against_forgery?
    false
  end
end
view.render partial: "mailers/#{name.to_s}", layout:false
于 2018-04-23T14:05:24.930 回答
-1

您好,要访问视图中的 url,您可以执行类似的操作

view = ActionView::Base.new(Rails.configuration.paths["app/views"].first)
view.extend ApplicationHelper

接着

template =  view.render(file: '#_file',:locals => { #_path: #_path, ...})
于 2014-06-19T08:34:55.837 回答