Od pewnego czasu piszę aplikację (zaczynałem z RoR 3.0) i wszystko ładnie działało do czasu przejścia na RoR 3.1.3. Pojawiły się problemy z Ajax-em. Same zapytania są poprawnie przekazywane do serwera, serwer je wykonuje, renderuje widoki i wysyła do przeglądarki. I tu pojawia się problem. W odpowiedzi brakuje nagłówka Content-type: text/javascript i przeglądarka nie wykonuje zwróconego javascriptu. Do tej pory robiłem to mniej więcej tak:
[code=ruby]def akcja
jakiś kod
respond_to do |format|
format.js { render :layout=>false }
end
end[/code]
Teraz to nie działa
Jedyne co udało mi się wykonać:
[code=ruby]def akcja
jakiś kod
respond_to do |format|
format.js { render :js=>“alert(“Zrobione”)”, :content_type => ‘text/javascript’, :layout=>false }
end
end[/code]
To jednak nie jest rozwiązanie bo czasami muszę całkiem spore dane przekazać do przeglądarki.
Samo dodanie :content_type => ‘text/javascript’ nie rozwiązuje problemu. Wygląda to tak jakby przy renderowaniu pliku akcja.js.erb RoR zapominał, co ma wysłać.
Jak sobie z tym poradzić? Gdzie szukać rozwiązania problemu?
w kontrolerze app/controllers/articles_controller.rb
def read
@article = Article.find params[:id]
current_user.articles << @article
response_to do |format|
format.js { render :layout=>false }
end
end
w widoku app/views/articles/read.js.erb
$("#articles_read").remove()
alert("Dodano do przeczytanych")
Jedną z przyczyn jest rack-1.3.5/lib/rack/conditionalget.rb. Wystarczyło do link_to dodać :method=>:post (i oczywiście zmiany w routes.rb) i nagłówek Content-type już się pojawia. Jednak zwracany skrypt nadal się nie wykonuje. Może przyczyna leży w jquery-rails? Wykorzystuję wersję 1.0.15.
W efekcie otrzymywałem błąd: Parse error unterminated string literal, który powinien pojawić się w konsoli FF a nie było go (znalazłem analizując krok po kroku działanie w Firebug-u). Javascript bardzo nie lubi znaku / i to on powodował błąd.
Po dodaniu tłumaczenia i zmodyfikowaniu pliku read.js.erb działa jak należy.