2016-03-05 16 views
5

Dal momento che molti giorni ho cercato di capire il motivo per cui un semplice link come questo:Differenza tra application.haml e application.html.haml?

link_to 'My Link', my_path(format: :js), remote: true 

era sempre piena tornando documento HTML invece di eseguire javascript situato nel mio file.js.erb:

alert('hello world') 

[...]

Dopo ore di debugging ho trovato il motivo:

Quando ho rinominare il mio layout principale di file come: application.haml rende piena documento HTML:

Started GET "/my_path/2.js" for 127.0.0.1 at 2016-03-05 12:28:20 +0100 
Processing by MyController#show as JS 
    Rendered my_path/show.js.erb within layouts/application (0.1ms) 
    Rendered layouts/_sidebar.html.erb (18.9ms) 
    Rendered layouts/_headbar.haml (0.5ms) 
    Rendered layouts/_flash_messages.html.haml (0.2ms) 
    Rendered layouts/_footer.html.erb (0.1ms) 
Completed 200 OK in 102ms (Views: 59.3ms | ActiveRecord: 2.9ms) 

Quando a rinominare il file di layout principale, come: application.html.haml esegue JavaScript correttamente e viene eseguito il mio ciao mondo popup:

Started GET "/my_path/8.js" for 127.0.0.1 at 2016-03-05 12:28:34 +0100 
Processing by MyController#show as JS 
    Rendered my_path/show.js.erb (0.1ms) 
Completed 200 OK in 24ms (Views: 21.8ms | ActiveRecord: 0.4ms) 

Perché c'è una differenza nel comportamento di javascript in base ai diversi nomi di file del mio layout?

+1

Questo non è un comportamento javascript, è il modo in cui i binari cercano i modelli. Prima cerca i file '. ', quindi per '. '. Pertanto, quando si dispone di un modello generico senza il formato, verrà preso per tutti i formati. – BroiSatse

+0

Se manca un modello di vista per un'azione, i binari segnaleranno un errore che indica come lo sta cercando incluso il percorso, il formato, ecc. Con tali informazioni, conoscerai l'ordine di ricerca. – canoe

risposta

1

Come BroiSatse detto:

Questo non è un comportamento JavaScript, è come rotaie ricerche per modelli. Prima cerca i file <action_name>.<templating-engine> , quindi per <action_name>.<format><templateing-engine>. Quindi, quando si dispone di modello generico senza il formato, verrà preso per tutti i formati .