2013-05-02 19 views
7

Próbuję zaktualizować model użytkownika poprzez Devise z AJAX i mieć Devise odpowiedzi z właściwego pliku javascript.Wymyślanie rejestracji # aktualizacji przez JS w Railsach

Chcę przesłać formularz zdalnie działaniu aktualizacji rejestracje #, ale to nie działa z odpowiedzi domyślnej z opracowania, które wykorzystuje następujące od RegistrationsController:

respond_with resource, :location => after_update_path_for(resource) 

Powyższe próbuje przekierowanie do domyślnej trasy zamiast renderowania pliku update.js.erb. Jestem w stanie zastąpić działania i mają pracować z następującymi zmianami:

respond_to do |format| 
    format.html 
    format.js 
end 

Ale to wydaje się bardzo brute force jak ja przesłaniając całą akcję. Czy istnieje prosty sposób, aby Devise wiedział, aby odpowiedzieć za pomocą javascript zamiast wykonywać domyślne przekierowanie?

+0

Może to pomoże http://natashatherobot.com/devise-rails-sign-in/ – Mindbreaker

Odpowiedz

11

Po prostu musiałem dodać linię do kontrolera RegistrationsController, aby Devise wiedział, czy odpowiadać zarówno html, jak i js.

class RegistrationsController < Devise::RegistrationsController 
    respond_to :html, :js 
end 

Czytanie o tym, jak respond_with naprawdę pomógł. Kilka dobrych linków:

Rails API Responder

AsciiCast

+0

Co ciekawe, rozwiązanie to działa na mnie gdy działanie #create odbywa smutną drogę i stawia na błędy resource, w którym to przypadku 'create.js.erb' jest wywoływane tak, jak można się spodziewać. Dzieje się to za pomocą 'remote: true' w formularzu. Ale w tym szczęśliwym przypadku odpowiada HTML. Widziałem podobny problem z sesjami # destroy, gdzie musiałem nadpisać prywatną metodę Devise ('response_to_on_destroy'), aby uzyskać odpowiedź na format format.js. Tak więc przynajmniej w niektórych przypadkach Devise popchnął swój kod odpowiedzi do metod kontrolerów, gdzie nie można się do niego dostać bez nadpisywania prywatnych metod. – user3670743

2

Niedawno soved to poprzez następujące korekty, oprócz dodawania remote: true do postaci:

config/inicjalizatory/opracowania:

# If http headers should be returned for AJAX requests. True by default. 
config.http_authenticatable_on_xhr = false 

config/routes.rb:

devise_for :users, controllers: { registrations: 'users/registrations' } 

controllers/users/registrations_controller.rb:

class Users::RegistrationsController < Devise::RegistrationsController 

    respond_to :html, :js 

end 

views/users/rejestracje/create.js.erb:

alert('success'); 

wyświetlenia/użytkownicy/rejestracje/new.js.erb:

alert('invalid'); 
Powiązane problemy