在控制器上运行以下代码时出现以下错误。请注意错误中的:formats=>[:json]
,即使:formats=>[:html]
已传递到render_to_string
我做错了什么?有任何想法吗? 实际上,下面的代码工作正常,不确定哪些更改会影响此错误。 Rails版本:3.2.8
顺便说一下模板肯定到位:loc / _search_details.html.erb
奖金问题:我在哪里可以找到api文档,显示哪些参数可以传递给render_to_string以及它是如何工作的?
错误: ActionView :: MissingTemplate(缺少部分loc / search_details,{:locale => [:en],:formats => [:json],:handlers => [:erb,:builder,:coffee] }。
respond_to do |format|
format.json {
@detail_str = render_to_string(:partial => 'loc/search_details', :layout => false, :formats=>[:html], :locals => {:beer_results => @beer_results})
@list_str = render_to_string(:partial => 'loc/search_list', :layout => false,:formats=>[:html], :locals => {:beer_results => @beer_results})
render :json => {:results => @results_hash, :result_details => @detail_str, :result_list => @list_str }
}
end
答案 0 :(得分:4)
如果你尝试
怎么办?render_to_string(:partial => 'loc/search_details.html.erb', :layout => false, :locals => {:beer_results => @beer_results})
或者
with_format("html") { render_to_string(:partial => 'loc/search_details', :layout => false, :locals => {:beer_results => @beer_results}) }
并添加方法
private
def with_format(format, &block)
old_format = @template_format
@template_format = format
result = block.call
@template_format = old_format
return result
end
来源:How do I render a partial of a different format in Rails?
答案 1 :(得分:4)
请参阅this question和this issue。由于您正在发出JSON请求,因此render_to_string
期待您的部分_search_details.json.erb
。您可以提供额外的JSON部分,重命名部分或将其添加到部分<% self.formats = [:json, :html] %>
,或者尝试在该问题的接受答案中使用变通方法。
答案 2 :(得分:2)
以防万一其他人在这上面,如果你要渲染一个字符串,你只需要在format.json块的上下文之外进行渲染。在您的示例中:
respond_to do |format|
@detail_str = render_to_string(:partial => 'loc/search_details', :locals => {:beer_results => @beer_results})
@list_str = render_to_string(:partial => 'loc/search_list', :locals => {:beer_results => @beer_results})
format.json {
render :json => {
:results => @results_hash,
:result_details => @detail_str,
:result_list => @list_str
}
}
end
这样,您不必指定格式或布局为false。
答案 3 :(得分:1)
尝试传递
:format => :html
而不是
:formats => [:html]
答案 4 :(得分:1)
万一有人遇到同样的问题,这对我有用。
使用render_to_string
时出现的错误消息与问题完全相同,但format
不匹配。然而,这并不是问题的根源。
问题是我的应用程序是i18n-ed并且在URL中给出了区域设置。我的routes.rb
看起来像这样:
Quoties::Application.routes.draw do
scope "(:locale)", locale: /en|pl/ do
# all routes go here
end
end
我的application_controller.rb
看起来像这样:
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :set_locale
def default_url_options(options={})
locale = I18n.locale
locale = nil if locale == :en
{ locale: locale }
end
def set_locale
parsed_locale = params[:locale] || 'en'
I18n.locale = I18n.available_locales.include?(parsed_locale.to_sym) ? parsed_locale : nil
end
end
(这是我在互联网上找到的解决方案的略微调整版本。)
在大多数地方都很好用。然而,当我在部分中使用路径助手时,结果却是“缺少部分”错误的原因,比如说
<%= item_path(item) %>
帮助的解决方法是用以下内容替换上述行:
<%= item_path(item, locale: params[:locale]) %>
我不知道为什么default_url_options
在这种情况下不起作用以及为什么Rails引发了这样一个奇怪的异常。
<% self.formats = [:html, :json] %>
解决方案只会使错误消息更清晰,因此至少在item_path
处将其更改为“无路由匹配...”。