2012-03-28 37 views
6

Tôi có một biểu mẫu với: remote => true có nghĩa là nó sẽ được gửi qua ajax.cách xử lý authenticate_user của devise! với cuộc gọi ajax?

Trong bộ điều khiển, tôi có mã như:

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

Đối với tôi chỉ cho phép khẳng định người sử dụng để tạo ra tài nguyên.

Tuy nhiên, khi thẩm định thất bại, đưa ra sẽ nâng cao một

Completed 401 Unauthorized 

và không phô trương javascript sẽ được trả lại.

Nhưng tôi hy vọng mọi thứ diễn ra như sau:

devise thiết lập một số thông điệp trong flash, pha trộn và trình .js.erb của tôi, sau đó tôi thấy đèn flash cho người dùng.

Làm cách nào để đạt được điều đó?

+0

Tôi không thể tin ... nhưng tôi đã có cùng một vấn đề hiện với devise 2.0.0.rc ... Tôi chỉ thêm vào câu hỏi của bạn rằng tôi thực sự không muốn thay đổi điều khiển phiên tạo hành động ... cũng ghi đè authenticate_user! dường như là vô lý ... định dạng điều hướng thay đổi trong cấu hình (thêm: js,: json) không hoạt động cho tôi –

Trả lời

3

Bạn cần tự mình xác thực! hành động và trong hành động này, bạn có thể có hành vi mà bạn muốn.

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

Nó là khá hài hước nhưng thay đổi trong devise.rb http_authenticatable_on_xhr false

config.http_authenticatable_on_xhr = false 

đã làm các trick cho tôi ... mà không trọng authenticate_user! phương pháp

lưu ý: Tôi cũng đã thêm: js sang các định dạng hướng

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

đó là logic trong đó ... với cờ được đặt thành yêu cầu ajax đúng chỉ trả lại tiêu đề cho 401 - vì vậy đối với Ví dụ cho các cuộc gọi json nó rất hữu ích. Khi bạn muốn phản ứng cơ thể thực sự, bạn phải đặt cờ này thành false –

+1

Có nó hoạt động! Nhưng tôi vẫn có một vấn đề. Khi xác thực không thành công, phát sinh sẽ hiển thị người dùng/sign_in.js, cách thay đổi nó? Tôi có nghĩa là tôi muốn làm cho tập tin js của riêng tôi và không nhất thiết phải trong public/users/folder. – HanXu

+0

Tôi khá chắc chắn rằng người dùng/sign_in.js.erb không được nằm trong thư mục công khai/người dùng mà bạn đã đề cập nhưng bên trong ứng dụng/lượt xem/người dùng/sign_in.js.erb (hoặc bất kỳ điều gì bạn nói ra) Quay lại vấn đề của bạn - Tôi sợ rằng cho người khác xem hơn người gọi không thể đạt được mà không ghi đè authenticate_user! –

Các vấn đề liên quan