10

在控制器上运行以下代码时出现以下错误。请注意:formats=>[:json]错误中的,即使:formats=>[:html]被传递到 render_to_string

我究竟做错了什么?有任何想法吗?实际上,下面的代码之前运行良好,不确定是什么更改影响了这个错误。导轨版本:3.2.8

顺便说一句,模板肯定到位:loc/_search_details.html.erb

额外的问题:我在哪里可以找到显示哪些参数可以传递给 render_to_string 以及它是如何工作的 api 文档?

错误: 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
4

5 回答 5

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

资料来源:如何在 Rails 中呈现不同格式的部分内容?

于 2012-12-04T22:56:52.203 回答
4

看到这个问题这个问题。由于您正在发出 JSON 请求,因此您render_to_string期望您的部分是_search_details.json.erb. 您可以提供额外的 JSON 部分,重命名部分或将其添加到部分<% self.formats = [:json, :html] %>,或者,尝试在该问题的已接受答案中的解决方法。

于 2012-12-05T00:11:48.953 回答
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

这样,您不必指定格式或布局为假。

于 2014-04-25T20:45:03.513 回答
1

尝试通过

:format => :html

代替

:formats => [:html]
于 2012-12-04T22:41:55.190 回答
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

(这是我在 Internet 某处找到的解决方案的略微调整版本。)

它在大多数地方都工作得很好。但是,当我在部分中使用路径帮助器时,结果是“缺少部分”错误的原因,比如说

<%= item_path(item) %>

有帮助的解决方法是将上述行替换为:

<%= item_path(item, locale: params[:locale]) %>

我不知道为什么default_url_options在这种情况下不起作用以及为什么 Rails 会引发如此奇怪的异常。

<% self.formats = [:html, :json] %>上面建议的解决方案只会使错误消息更清晰,因此至少它更改为在item_path.

于 2012-12-16T11:11:08.327 回答