2010-05-02 8 views
18

Utilizzo di rails3 - Ho un progetto con molte attività. Voglio usare javascript per costruire l'interfaccia utente per ogni attività. Ho pensato che potevo visualizzare quelle attività nella pagina di presentazione dei progetti, rendendo un partial javascript per ciascuno. Non riesco a visualizzare "tasks/show" per vedere tasks/show.js.erb Qualche idea?Come rendere partial.js nelle rotaie 3

Nei progetti/show.html.erb

<div id="tasks"> 
<%= render(:partial => "tasks/show", :collection => @project.tasks) %> 
</div> 

compiti/show.js.erb

$("tasks").append(new TaskWidget(task.id)) 

ottengo gli errori

ActionView::MissingTemplate in Projects#show 

Missing partial tasks/show with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html], :locale=>[:en, :en]} in view paths .... around line #13 

Grazie

+0

Non sono sicuro, ma cercare: <% = render (: parziale => "compiti/show.js ",: collection => @ project.tasks)%> – fig

+0

grazie, ma sfortunatamente ottengo la stessa cosa: mancate attività parziali/show.js –

risposta

26

shouldn è nel file _show.js.erb?

Da "Using Partials".

+0

Questo ha funzionato per me finché non ho usato" per piano testo Sostituendo l'avviso ("test") con al ert ('test') ha iniziato a funzionare correttamente per me. – Philip

2

Il problema è che in Rails 3 il rendering dal file .js cercherà solo per i file in forma di show.js.erb o show.erb

Per aggirare il problema, si sia bisogno di creare un file _show.js.erb, ma dal momento che questo tipo di sconfigge lo scopo dei partial, in alternativa puoi semplicemente rinominare il file show.html.erb per mostrare.erb

Questa è probabilmente una cattiva pratica, però, per fare un'azione di controller standard senza una fine di tipo (ad esempio show.erb)

Cosa farei se fossi in te rinominare il tuo parziale qualcosa come _tasks.erb invece di _show.html.erb, e quindi se ti servisse un task/show.html.erb potresti semplicemente rendere il _tasks partial all'interno di quella vista.

3

Beh, io non so se è lo stesso problema, ma ho passato una cosa simile con rotaie 3. Ho avuto ad esempio una vista parziale in app/views/invoices/_select.html.erb e sono stato in grado di rendere in una vista con

<% = render: partial => "fatture/selezionare" %>

con qualsiasi problema e se nel controllore metto

rendono: parziale => "fatture/selezionare"

ero in grado di aprire l'azione nel browser, il problema si pone quando provo a chiamare l'azione da una chiamata AJAX, allora ottengo l'errore ActionView::MissingTemplate. L'unico modo che ho trovato per risolvere è stato quello di rinominare la vista a _select.rhtml e poi ogni cosa funziona bene.

+0

Ho lo stesso problema. Ho funzionato copiando il file e cambiando html in js nel nome del file, come suggerito da Michael. Ma questa non sembra essere una buona soluzione. –

5

Prova:

render: parziale => "compiti/show.js"

+0

se lo facesse, e cambiò il nome del file in _show.js.erb, funzionerebbe allo – bonhoffer

10

si può provare questo. Invece di avere un partial Javacript puoi creare un codice html _show_js.html.erb e circondare il tuo codice JS con il tag html <script>.

<script type='text/javascript'> 
$("tasks").append(new TaskWidget(task.id)) 
</script> 

e,

<div id="tasks"> 
<%= render(:partial => "tasks/show_js", :collection => @project.tasks) %> 
</div> 
+0

Per il ** miglioramento progressivo ** dovresti considerare di collegare le tue funzionalità desiderate tramite buoni selettori JS vecchi - una volta solo HTML di base la versione funziona :) – user569825

4

per farlo funzionare avevo bisogno di aggiungere il formato:

<script> 
    <%= render(:partial => 'shared/topmenujs', :formats => [:js]) %> 
    </script>