我必须渲染一些模板并将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?
答案 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, ...})