Devise Registration#update via JS in Rails

2019-06-18 02:38发布

问题:

I'm trying to update the User model through Devise with AJAX and have Devise respond with the proper javascript file.

I want to submit the form remotely to the registrations#update action, but this isn't working with the default response from Devise, which uses the following from the RegistrationsController:

respond_with resource, :location => after_update_path_for(resource)

The above tries to redirect to the default route instead of rendering the update.js.erb file. I am able to overwrite the action and have it work with the following change:

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

But, this seems very brute force as I'm overriding the entire action. Is there a simple way for Devise to know to respond with javascript instead of doing its default redirect?

回答1:

Simply had to add a line to the RegistrationsController so that Devise knows to respond_to both html and js.

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

Reading up on how respond_with really helped. Couple of good links:

Rails API Responder

AsciiCast



回答2:

I recently soved this by making the following adjustments, in addition to adding remote: true to the form:

config/initializers/devise:

# 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/registrations/create.js.erb:

alert('success');

views/users/registrations/new.js.erb:

alert('invalid');