2012-03-28 4 views
6

Mam formularz z: remote => true, co oznacza, że ​​zostanie przesłany przez ajax.jak radzić sobie z authenticate_user devise! z wywołaniem ajax?

w sterowniku, mam taki kod:

before_filter: authenticate_user!, :only => [:create] 

Bo pozwalają potwierdzić tylko użytkownikowi tworzenie zasobu.

Jednak, gdy uwierzytelnienie nie powiedzie się, opracować podniesie

Completed 401 Unauthorized 

i nie dyskretny javascript będą renderowane.

Ale mam nadzieję, że wszystko idzie tak:

Devise ustawić kilka wiadomości w lampę błyskową, a czynią moje .js.erb, potem pokażę lampy błyskowej dla użytkowników.

Jak to osiągnąć?

+0

nie mogę uwierzyć ... ale mam ten sam problem z aktualnie opracowują 2.0.0.rc ... ja tylko dodaj do swojego pytania, że ​​naprawdę nie chcę, aby zmiana kontrolera sesji tworzyła akcję ... także przesłonięcie authenticate_user! wydaje się być śmieszne ... zmiany formatów nawigacyjnych w konfiguracji (dodanie: js,: json) nie działa dla mnie –

Odpowiedz

3

Potrzebujesz swojego własnego użytkownika authenticate_user! działania i w tym działaniu możesz mieć to, czego chcesz.

def authenticate_user! 
    unless current_user 
    render 'my_js' 
    end 
end 
10

Jest to dość zabawne, ale zmiany w devise.rb http_authenticatable_on_xhr false

config.http_authenticatable_on_xhr = false 

wystarczyły dla mnie ... bez przesłanianie authenticate_user! Metoda

uwaga: Dodałem również: js do formatów nawigacyjnych

config.navigational_formats = [:"*/*", "*/*", :html, :js] 
+0

logika polega na tym, że z flagą ustawioną na prawdziwe zapytanie ajax zwraca tylko nagłówki dla 401 - tak dla instancja dla wywołań json jest przydatna. Gdy potrzebujesz prawdziwej odpowiedzi ciała, musisz ustawić tę flagę na false –

+1

Tak, działa! Ale wciąż mam problem. Kiedy uwierzytelnianie nie powiedzie się, program deinstaluje user/sign_in.js, jak to zmienić? Chodzi mi o to, że chcę renderować własny plik js, a niekoniecznie w folderze public/users /. – HanXu

+0

Jestem prawie pewny, że użytkownicy/sign_in.js.erb nie powinni znajdować się w folderze public/users, o którym wspomniałeś, ale wewnątrz app/views/users/sign_in.js.erb (lub cokolwiek powiesz devise) Powrót do problemu - Obawiam się, że nie można uzyskać innego widoku niż rozmówcy, bez przesłonięcia authenticate_user! –