2012-12-04 12 views
10

Viene visualizzato l'errore seguente quando si esegue il codice riportato di seguito su un controller. Si prega di notare il :formats=>[:json] nell'errore, anche se :formats=>[:html] è passato in render_to_stringrendering_to_string errore di formato parziale nel controller

Cosa sto facendo male? Qualche idea? In realtà, il codice sotto funzionava bene prima, non so quali modifiche hanno influenzato questo errore. Versione Rails: 3.2.8

btw il modello è decisamente a posto: loc/_search_details.html.erb

domanda

Bonus: dove posso trovare la documentazione delle API che mostra quali parametri possono essere passati per render_to_string e come Funziona?

Errore: ActionView :: MissingTemplate (mancanza parziale Loc/SEARCH_DETAILS con {: locale => [: it],: formati => [: JSON],: i gestori => [: Erb,: costruttore,: caffè]}.

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

Non penso che ': format' sia un parametro valido da passare a' render'. –

+0

Non sto utilizzando: formato, è: formati – vrepsys

+0

Vero. Comunque non penso che sia un parametro valido. –

risposta

4

Vedi this question e this issue. Poiché stai facendo una richiesta JSON, il tuo render_to_string prevede che il tuo numero sia _search_details.json.erb. È possibile fornire un partial JSON aggiuntivo, rinominare il partial o aggiungerlo allo <% self.formats = [:json, :html] %> parziale o, in alternativa, provare la soluzione alternativa nella risposta accettata a tale domanda.

+3

Ti stai sbagliando, il parametro ': formats => [: html]' su 'render_to_string' lo rende così cercherà' _search_details.html.erb' prima. L'ho provato da solo, e funziona, almeno in Rails 3.2.9. – mrbrdo

+0

<% self.formats = [: json,: html]%> - questo funziona davvero – vrepsys

+0

Ho bisogno di entrambi: formats => [: html] passato al metodo render_to_string e <% self.formats = [: json, : html]%> nel parziale per farlo funzionare correttamente. – Mitya

1

tenta di passare

:format => :html 

Invece di

:formats => [:html] 
+0

nessun effetto, comunque lo – vrepsys

+0

Questo è appena sufficiente per RoR4, grazie. – gertas

+0

': formats' funziona in 4.2.1, mentre': format' no. – lulalala

4

Che cosa succede se si tenta

render_to_string(:partial => 'loc/search_details.html.erb', :layout => false, :locals => {:beer_results => @beer_results}) 

O

with_format("html") { render_to_string(:partial => 'loc/search_details', :layout => false, :locals => {:beer_results => @beer_results}) } 

e aggiungere il metodo

private 
def with_format(format, &block) 
    old_format = @template_format 
    @template_format = format 
    result = block.call 
    @template_format = old_format 
    return result 
end 

Fonte: How do I render a partial of a different format in Rails?

+0

La prima soluzione fornisce un avviso di deprecazione: AVVISO DI AVVISO: il passaggio di un gestore modello nel nome del modello è deprecato. Puoi semplicemente rimuovere il nome del gestore o passare render: handlers => [: erb]. – vrepsys

+0

Hai provato a passare: gestori o la seconda soluzione ha funzionato per te? I gestori di passaggio – mrbrdo

+0

non aiutano, c'è un altro avviso di deprecazione su: formati html, se aggiungo formati ritorno al codice che ho e non funziona. La seconda soluzione sembra un trucco sporco :) Proverò un po 'più tardi. – vrepsys

1

Nel caso in cui qualcuno abbia lo stesso problema, ecco cosa ha funzionato per me.

Il messaggio di errore che avevo quando si utilizza render_to_string era esattamente lo stesso della domanda, completo con la discrepanza format. Tuttavia, non era davvero la fonte del problema.

Il problema era che la mia app era i18n-ed e le impostazioni locali erano indicate nell'URL. Il mio routes.rb assomiglia a questo:

Quoties::Application.routes.draw do 

    scope "(:locale)", locale: /en|pl/ do 
    # all routes go here 
    end 

end 

e la mia application_controller.rb si presentava così:

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 

(Si tratta di una versione leggermente modificato di una soluzione che ho trovato da qualche parte su Internet.)

Ha funzionato abbastanza bene nella maggior parte dei posti.Tuttavia, si è rivelato essere la causa della 'mancante parziale' errore quando usando un helper percorso nel parziale, dire

<%= item_path(item) %> 

La soluzione che ha contribuito fu sostituendo la linea precedente con:

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

Non ho idea del motivo per cui lo default_url_options non funzioni in questo caso e perché Rails abbia sollevato un'eccezione così bizzarra.

<% self.formats = [:html, :json] %> soluzione suggerita sopra solo ha reso il messaggio di errore più chiaro, in modo che almeno si è modificato in "nessuna corrispondenza corrisponde ..." generata a item_path.

2

Nel caso in cui qualcuno stubmles su questo, se si esegue il rendering a una stringa, è sufficiente eseguire il rendering al di fuori del contesto del blocco format.json. Nel tuo esempio:

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 

In questo modo, non è necessario specificare i formati o il layout è falso.

Problemi correlati