json erb模板找不到其他html偏

时间:2011-03-23 06:42:25

标签: ruby-on-rails json partial-views

我正在尝试使用json响应,其中某些值是由部分

呈现的html
#projects_Controller.rb

def index
  respond_to do |f|
    f.json 
  end
end

# index.json.erb

  {
     "html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer') %>"
  }

但是我收到以下错误:

  ActionView::Template::Error (Missing partial projects/disclaimer with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>
  [:json], :locale=>[:en, :en]} in view paths "c:/rails/app/views", "c:/rails/vendor/plugins/more/app/views", "C:/Ruby192/lib/ruby/gems/1.9.1/gems/devise-1.1.8/app/views")

看来JSON请求在其名称中使用.json.erb呈现部分但不是.html.erb,这就是我所拥有的。 有没有办法让我指定'html'。

增加: 如果请求是'js',并且在index.js.erb中我呈现几乎相同的代码:     #index.js.erb

  disclaimer = {
     "html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer') %>"
  }

它确实找到了projects / disclaimer.html.erb并正确呈现它。我想知道为什么会出现这样的不一致,如果有人请求js,其模板中的任何部分渲染都会查找partial_name.html.erb,但如果有人请求json,则部分渲染会要求partial_name.json.erb?

谢谢

4 个答案:

答案 0 :(得分:13)

得到它:所有需要的是.json.erb文件中的这一行           &lt;%self.formats = [“html”]%&gt;

所以完整的index.json.erb

      <% self.formats = ["html"] %>
      disclaimer = {
        "html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer',
                    :content_type => 'text/html'), 
                    :locals => {:localVariable => @localVariable} 
                %>"
      }

答案 1 :(得分:5)

我的回答类似于上面的Nik。我为json.erb模板提供了以下帮助:

# helpers useful for json.erb templates
module JsonHelper

  # Same as render but force actionview to look for html templates instead of json.
  def render_html(options={}, locals={}, &block)
    old_formats = formats
    self.formats = [:html] # hack so partials resolve with html not json format
    render options, locals, &block  

  ensure
    self.formats = old_formats 
  end 

  # json escape a string. For example <%=json "some { string }" %>
  def json(value)
    raw value.to_json
  end 
end

所以现在我可以编写像

这样的模板
{
  "html": <%=json render_html(:partial => 'some_partial') %>,
  "status": success
}

如果actionview允许使用类似于23tux的示例中的content_type进行渲染(这对我不起作用),那就更好了。如果只有* .html.erb进行html转义而不是所有* .erb文件,那也会更好。

答案 2 :(得分:2)

对于未来的读者,您可以传递这样的格式参数。

= render partial: 'user', locals: {xyz: @xyz}, :formats => [:html]

答案 3 :(得分:0)

我不确定我是否帮助你,但也许你可以使用这样的内容类型:

disclaimer = {
  "html":"<%= raw escape_javascript(render :partial => 'projects/disclaimer', :content_type => 'text/html'), :locals => {:localVariable => @localVariable} %>"
}

:如果你想将var传递给部分,那么本地就是这样。