2013-05-02 20 views
7

Tôi đang cố gắng cập nhật Mô hình người dùng thông qua Devise với AJAX và có Devise trả lời với tệp javascript thích hợp.Devise Registration # update thông qua JS trong Rails

Tôi muốn gửi biểu mẫu từ xa đến đăng ký # cập nhật hành động, nhưng điều này không làm việc với các phản ứng mặc định từ lập mưu, trong đó sử dụng sau từ RegistrationsController:

respond_with resource, :location => after_update_path_for(resource) 

Các cố gắng ở trên để chuyển hướng đến tuyến đường mặc định thay vì hiển thị tệp update.js.erb. Tôi có thể ghi đè tác vụ và thực hiện hành động với thay đổi sau:

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

Nhưng, điều này có vẻ rất bạo lực khi tôi ghi đè toàn bộ hành động. Có cách nào đơn giản để Devise biết để trả lời với javascript thay vì thực hiện chuyển hướng mặc định của nó?

+0

Có lẽ điều này có thể giúp http://natashatherobot.com/devise-rails-sign-in/ – Mindbreaker

Trả lời

11

Đơn giản chỉ cần thêm một dòng vào RegistrationsController để Devise biết trả lời cho cả html và js.

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

Đọc về cách trả lời với sự trợ giúp thực sự. Vài liên kết tốt:

Rails API Responder

AsciiCast

+0

Điều thú vị là, giải pháp này làm việc cho tôi khi hành động #create mất con đường buồn và đặt lỗi trên tài nguyên, trong trường hợp đó 'create.js.erb' được gọi như bạn mong đợi. Điều này là với 'từ xa: true' trong biểu mẫu. Nhưng trong trường hợp hạnh phúc, nó phản hồi bằng HTML. Tôi đã thấy một vấn đề tương tự với việc hủy phiên #, nơi tôi phải ghi đè phương thức Devise riêng ('respond_to_on_destroy') để làm cho nó phản hồi với định dạng.js. Vì vậy, ít nhất trong một số trường hợp, Devise đã đẩy mã phản hồi của họ xuống các phương thức điều khiển mà bạn không thể nhận được ở đó mà không cần sử dụng các phương thức riêng tư. – user3670743

2

Gần đây tôi soved này bằng cách làm những điều chỉnh sau, ngoài việc bổ sung remote: true mẫu:

config/initializers/đưa ra:

# 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/người dùng/registrations_controller.rb:

class Users::RegistrationsController < Devise::RegistrationsController 

    respond_to :html, :js 

end 

views/người dùng/đăng ký/create.js.erb:

alert('success'); 

lượt xem/người dùng/đăng ký/new.js.erb:

alert('invalid'); 
Các vấn đề liên quan