2010-11-19 14 views
30

nie mam pojęcia, dlaczego to nie działa, uczę się szyny i Obserwuję książkę to mówi to zrobić tak:Rails form_for: remote => prawda nie jest wywołanie metody js

<%= form_for([@article,@article.comments.new ], :remote=>true, :html => {:style=>'display: none;' }) do |f|%> 
    <div class="field"> 
     <%= f.label :name %> 
     <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
     <%= f.label :email %> 
     <%= f.text_field :email %> 
    </div> 
    <div class="field"> 
     <%= f.label :body %> 
     <%= f.text_area :body %> 
    </div> 
    <%= f.submit %> 
<% end %> 

Jednak to nie działa, a gdy sprawdzam żądanie w firebug, adres URL nie kończy się na .js, czy masz jakieś pomysły, dlaczego?

+0

można dodać według metod kontrolera (np.index, create, new) i powiązane pliki widoku, abyśmy mogli zobaczyć cały obraz? – Ingo

Odpowiedz

-11

Zmiana:

[@article,@article.comments.new ] 

dla

@article 

Proponuję czytanie API na powiązanej odcinku: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

+2

ryudice chce mieć nowy formularz komentarzy do artykułu z ryudice. Polecenie forma_for dla ryudice jest poprawną składnią tego, czego chce ryudice. Twoja sugestia będzie odpowiednia dla standardowego formularza artykułu. Jest to mylące, ponieważ kontekst nigdy nie jest określony. – natedavisolds

32

Po sprawdzeniu wniosek złożony w Firebug, tylko dlatego, że adres URL nie zakończyło się na .js, nie oznacza to, że nie został wywołany z javascript. Aby sprawdzić, czy powinieneś sprawdzić nagłówek żądania, aby zobaczyć, jaki jest parametr Accept. Jeśli mówi "application/javascript", to wszystko jest w porządku.

Po drugie, bardzo częstym problemem podczas próby wypróbowania: remote => true jest to, że wymagane biblioteki javascript nie są zawarte w kodzie. Więc wydaje mi się, że następujący kod brakuje układu:

<%= javascript_include_tag :defaults %> 
<%= csrf_meta_tag %> 

Jeśli tak jest, po prostu umieścić go wewnątrz <head> tagu swojego układu.

+0

masz na myśli przez "nagłówek html" head tag szablonu, gdzie formularz/link ze zdalnym: prawda jest? – Timo

+0

Tak, dziękuję za wskazanie. To nie było takie jasne. Ale tak, powinien być zawarty w środku, aby tag – DanneManne

21

Najprawdopodobniej brakuje pliku rails.js, który obsługuje to za Ciebie, niezależnie od tego, czy używasz prototypu, czy jquery.

Jeśli korzystasz z jQuery, najłatwiejszym sposobem uzyskania wszystkich potrzebnych plików jest skorzystanie z klejnotu jquery-rails. Spowoduje to dodanie generatora do instalacji jquery i potrzebnego rails.js.

typ coś wewnątrz korzenia aplikacji Rails:

rails g jquery:install 

A potem, wewnątrz application.html.erb dodać linię

<%= javascript_include_tag :defaults %> 

lub jawnie (nie zapomnij podać swojego jQuery osobno):

<%= javascript_include_tag :rails, :application %> 

[EDYCJA: dla Rails 3.1 lub nowszych przy użyciu zasobu Rurociąg]

Użyj jquery-rails gem (jak wspomniano powyżej) i dodać następujące linie do app/assets/javascripts/application.js (jeśli nie są one tam już):

//= require jquery 
//= require jquery_ujs 

Nadzieja to pomaga!

+0

działało dobrze .. Dzięki .. – Neo

+0

Mieliśmy ten problem, ale dodaliśmy 'jquery_ujs.js', aby go naprawić. –

+0

Tak, prawda, zmieniła się nieco z szynami 3.1 i potokiem aktywów. Zaktualizowałem swoją odpowiedź, aby to odzwierciedlić. – nathanvda

4

Sprawdź kontroler: czy ma blok respond_to?

Jeśli generowane swoją aplikację z szynami generowania rusztowania, będzie miał coś podobnego

respond_to do |format| 
     format.html 
     format.xml { .... } 
    end 

Jeśli to ma, po prostu wziąć cały blok się z respond_to do końca; lub alternatywnie zastąpić cały blok z jednej linii

respond_to :html, :js 

lub alternatywnie edytować blok dodając dodatkową linię pokazaną tutaj

respond_to do |format| 
     format.html 
     format.js 
     format.xml { .... } 
    end 

Albo powinien działać w Twoim przypadku.

4

Sprawdź plik /app/assets/javascript/application.js

To powinno być zawarte w plikach poniżej tam. jquery_ujs jest odpowiedzialny za pracę z funkcją remote=> true.

require `jquery` 
require `jquery_ujs` 

Happy Coding !!

+1

Miałem podobny problem z nowicjuszem podczas wykonywania "Agile Web Development with Rails", w rozdziale 11.2 Iteracja F2: Tworzenie koszyka opartego na AJAX. Problem rozwiązuje się przez odkomentowanie '= require jquery' w pliku, który wymieniłeś. Mam nadzieję, że to pomaga innym ludziom. –

+0

To świetny @ cppinitiator! –

6

Ten błąd występuje, gdy nie dodano jeszcze pliku jquery_ujs. Właśnie dodałeś plik jquery.

Więc trzeba dodawać zarówno pliki ręcznie przeglądać lub wymagają ich w application.js lub dowolny inny plik, którego używasz do konkretnego układ.

W zależności od scenariusza można wykonać pierwsze lub drugie rozwiązanie.

1-ty rozwiązanie:

<%= javascript_include_tag :jquery, :jquery_ujs %> 

2-te rozwiązanie:

  1. wymagają zarówno jQuery i jquery_ujs w app/aktywa/application.js

    //= require jquery.js 
    
    //= require jquery_ujs 
    
  2. Dołącz plik application.js do pliku określonego układu.

    <%= javascript_include_tag :application %> 
    

Uwaga:

Również dodać tag CSRF w pliku układ dla obu rozwiązań.

<%= csrf_meta_tag %> 

Jestem przekonany, że masz poniżej kod w swoim Gemfile i już zainstalowałeś ten Klejnot.

gem 'jquery-rails' 
+0

Drugie rozwiązanie rozwiązało mój problem! –

Powiązane problemy