2016-03-05 44 views
5

Od wielu dni starałem się zrozumieć, dlaczego prosty link jak ten:Różnica między application.haml a application.html.haml?

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

zawsze wraca pełny dokument HTML zamiast wykonania JavaScript zlokalizowany w moim file.js.erb:

alert('hello world') 

[...]

Po godzinach debugowanie znalazłem dlaczego:

Kiedy zmienić nazwę mój główny układ złożyć takie jak: application.haml to świadczy pełny dokument 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) 

Kiedy zmienić nazwę mój główny plik układu, takich jak: application.html.haml to wykonuje javascript prawidłowo i działa mój hello world 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) 

Dlaczego zachowanie javascript różni się w zależności od różnych nazw plików w moim układzie?

+1

Nie jest to zachowanie javascript, tak jak rails szuka szablonów. Najpierw wyszukaj '. ', następnie dla '. '. Więc jeśli masz ogólny szablon bez formatu, zostanie on pobrany dla wszystkich formatów. – BroiSatse

+0

Jeśli brakuje jakiegoś szablonu widoku dla akcji, szyny zgłaszają błąd, który mówi, w jaki sposób go szukają, w tym ścieżkę, format itp. Dzięki tym informacjom poznasz kolejność wyszukiwania. – canoe

Odpowiedz

1

Jak BroiSatse powiedział:

To nie jest zachowanie javascript, to jak szyny wyszukuje szablonów. Najpierw wyszukaj pliki <action_name>.<templating-engine> , a następnie dla <action_name>.<format><templateing-engine>. Więc gdy masz ogólny szablon bez formatu, zostanie on pobrany dla wszystkich formatów.