2012-12-04 35 views
10

在控制器上運行下面的代碼時,出現以下錯誤。請注意錯誤中的:formats=>[:json],儘管:formats=>[:html]已傳遞到render_to_string中控制器中render_to_string部分格式錯誤

我在做什麼錯?有任何想法嗎? 其實,下面的代碼之前工作得很好,不知道哪些更改會影響此錯誤。 Rails的版本:3.2.8

者均基於模板絕對是到位:LOC/_search_details.html.erb

獎金的問題:我在哪裏可以找到出什麼參數可以傳遞給render_to_string API文檔,以及如何有用?

錯誤: ::的ActionView MissingTemplate(缺少部分LOC/SEARCH_DETAILS含{:區域設置=> [:EN]:格式=> [:JSON]:處理程序=> [:ERB,:助洗劑,:咖啡]}。

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

我不認爲':format'是傳遞給'render'的有效參數。 –

+0

我沒有使用:格式,它是:格式 – vrepsys

+0

正確。但我不認爲這是一個有效的參數。 –

回答

4

this questionthis issue。由於您正在發出JSON請求,因此您的render_to_string預計您的部分爲_search_details.json.erb。您可以提供額外的JSON部分,重命名部分或將其添加到部分<% self.formats = [:json, :html] %>,或者,也可以嘗試在該問題的接受答案中的解決方法。

+3

你錯了,':formats => [:html]'參數指向'render_to_string'使得它首先查找'_search_details.html.erb'。我已經自己測試過了,至少在Rails 3.2.9中是有效的。 – mrbrdo

+0

<%self.formats = [:json,:html]%> - 這個實際工作 – vrepsys

+0

我需要both:formats => [:html]傳遞給render_to_string方法,<%self.formats = [:json, :html]%>以使其正常工作。 – Mitya

1

試圖通過

:format => :html 

而不是

:formats => [:html] 
+0

根本沒有任何效果,thx反正 – vrepsys

+0

這對於RoR4來說就夠了,謝謝。 – gertas

+0

':格式'在4.2.1中工作,而':format'不在。 – lulalala

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?

+0

第一個解決方案提供棄用警告:DEPRECATION警告:不建議在模板名稱中傳遞模板處理程序。您可以簡單地刪除處理程序名稱或傳遞render:handlers => [:erb]。 – vrepsys

+0

您是否嘗試過傳遞:處理程序還是第二種解決方案適合您? – mrbrdo

+0

傳遞處理程序沒有幫助,還有另一個關於格式html的棄用警告:如果我添加格式,則返回到我有的代碼,但它不起作用。 第二個解決方案看起來像一個骯髒的黑客:)我會稍後嘗試。 – vrepsys

1

爲防萬一有人有同樣的問題,這是對我有用。

我在使用render_to_string時出現的錯誤消息與問題中的錯誤消息完全相同,與format不匹配。但是,這不是問題的根源。

問題是我的應用程序是國際化的,區域設置是在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處引發的「無路由匹配...」。

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 

通過這種方式,你不必指定格式或佈局是假的。