在 lib 类中,render_to_string 不起作用。

24

我正在尝试使用delayed_job通过xml更新远程数据库。

我在我的lib文件夹中放置了一个类文件,该文件应该使用template.xml.builder执行render_to_text操作,但是我遇到了以下问题:

undefined method `render_to_string' for #<SyncJob:0x7faf4e6c0480>...

我做错了什么?

5个回答

62
ac = ActionController::Base.new()
ac.render_to_string(:partial => '/path/to/your/template', :locals => {:varable => somevarable})

10
如果您想将其与实例变量一起使用,请这样做 :locals => {:@instance_variable => value} - Jason Kim
我遇到了“Missing template”错误,看起来好像找不到那个局部模板,而且我已经检查了很多次拼写,但还是没用。请帮忙。 - AirWick219
你会收到“缺少模板”错误,因为ActionController::Base将在action_controller/base路径中搜索。委托给另一个控制器。通常它会继承ActionController::Base - denis.peplin
另外,如果您想将其与常规页面(而非部分)一起使用,只需省略:partial =>部分,像这样:ac.render_to_string('/path/to/your/template', :locals => {:varable => somevarable})(请注意,路径是从/views目录内开始的,例如,您可以有'users/index.html.erb')。 - stevec

8
我遇到了一个未定义的帮助方法问题,然后我使用了ApplicationController
ApplicationController.new.render_to_string

一样的情况。你曾经修复过未定义的帮助程序吗? - Natus Drew
在我的情况下,当调用ApplicationController时,我忘记了一个命名空间。我尝试:Usr::ApplicationController.new.render_to_string然后它就可以工作了。 - Germano

3

render_to_string定义在ActionController :: Base中。由于该类/模块是在Rails控制器范围之外定义的,因此函数不可用。

您将需要手动渲染文件。我不知道您在模板方面使用的是什么(ERB,Haml等)。但是您需要加载模板并自己解析它。

如果是ERB,则可以像这样:

require 'erb'

x = 42
template = ERB.new <<-EOF
  The value of x is: <%= x %>
EOF
puts template.result(binding)

你需要打开模板文件并将其内容发送到ERB.new,但这是留给你的练习。以下是ERB的文档
这就是大致的想法。

3

Rails 5

render_to_string等方法现在作为控制器的类方法可用。因此,您可以在任何喜欢的控制器中执行以下操作:ApplicationController.render_to_string

我特别需要根据对象的类分配动态实例变量到模板中,所以我的示例看起来像:

ApplicationController.render_to_string(
  assigns: { :"#{lowercase_class}" => document_object },
  inline: '' # or whatever templates you want to use
)

这是一篇很棒的博客文章,介绍了制作rails PR的开发人员。文章链接:https://evilmartians.com/chronicles/new-feature-in-rails-5-render-views-outside-of-actions


2
你可以将你的template.xml.builder转化为一个局部文件(_template.xml.builder),然后通过实例化一个ActionView::Base对象并调用render方法来渲染它。
av = ActionView::Base.new(Rails::Configuration.new.view_path)
av.extend ApplicationController.master_helper_module
xml = av.render :partial => 'something/template'

我还没有尝试过用xml,但是它可以很好地处理html局部文件。


2
我得到了一个错误信息:Rails::Configuration:Module没有定义`new'方法。 - Nicolas Raoul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接