Rails 如何单独使用 erb 这类的模板呢?貌似网上找的一些方法在 Rails 3.2 下都不能用。

jimrokliu · 2012年03月09日 · 最后由 jimrokliu 回复于 2012年03月09日 · 4763 次阅读

最近开发应用的时候,希望将某些页面的内容做为消息发送给第三方的程序,因此想要在 rails 中单独启动一个线程做这件事,从网上找到的方法大概如下:

class TaskActionView < ActionView::Base
    include ActionDispatch::Routing::UrlFor

    include Rails.application.routes.url_helpers
    include ApplicationHelper

    def default_url_options
        {host: 'example.com'}
    end
end

def action_view
    controller = ActionController::Base.new
    controller.request = ActionDispatch::TestRequest.new
    TaskActionView.new(Rails.root.join('app', 'views'), {}, controller)
end

tv = action_view()
tv.assign(:group =>Group.new)
tv.render(:template=>"groups/_form")

在实际的调用中,一直遇到这样的错误:

ActionView::Template::Error:
       undefined method `model_name' for NilClass:Class
     # ./app/views/groups/_form.html.erb:1:in `_app_views_groups__form_html_erb___2686766126405061367_2175427740'
     # ./app/models/web_agent.rb:18:in `render'
     # ./spec/models/web_agent_spec.rb:19:in `block (2 levels) in <top (required)>'

其中 groups/_form.html.erb 文件中包含有

<%= form_for @group,:html => {:id=>"group_form",:class=>"form-vertical"},:remote=>true   do |f| %>

这个问题谁有经验,能分享一下吗?

没人关注就自己再记录一下吧,如果不设置@group,还有另外一个错误,

ActionView::Template::Error: In order to use #url_for, you must include routing helpers explicitly. For instance, `include Rails.application.routes.url_helpers 这个信息实在看不懂,什么叫 include explicitly?

说明你 erb 页面上的@group是空的,没有获取到

@chinacheng @group确实通 tv.assign 做了传递。 从 stackoverflow 上看对这一问题的回答大部分都是基于 3.1 的 rails,现在怀疑 3.2 使用了新的 route 引擎,代码是否不一样。

@jimrokliu 为什么不直接 render json?

@bony 确实项目要用 json,json 用的 jbuilder 去实现的,但试了一下,好像不行,问题出在 url_for 这样的 helper 无法找到方法,所以先检验以下 erb 的模板。对 rails 懂得还是不够,rails 系统自身发送 html 邮件和测试 controller 应该都是可以另外调用模板的。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号