从Rails模型渲染部分时访问URL助手

时间:2013-12-07 05:20:23

标签: ruby-on-rails actionmailer actionview actionviewhelper

我必须渲染一些模板并将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 个答案:

答案 0 :(得分:1)

Rails 5 中,很简单:

ApplicationController.render partial: 'my/partial'

它将加载所有助手

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

答案 1 :(得分:0)

我找到的解决方法是将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: 'productos.meloncargo.com' }
  end

# config/environments/development.rb
  config.after_initialize do
    Rails.application.routes.default_url_options = { host: 'localhost', port: 3000 }
  end

答案 2 :(得分: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

答案 3 :(得分:-1)

您好,要访问视图中的网址,您可以执行类似

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

然后

template =  view.render(file: '#_file',:locals => { #_path: #_path, ...})