2013-08-24 30 views
10

Vì một lý do nào đó, current_user trả về nil trong bộ điều khiển ít mô hình của tôi (Subscriptions). Tôi đã tìm thấy gì trên Internet để biện minh cho hành vi này ...Rails Devise - current_user là nil

class SubscriptionsController < ApplicationController 
    def new 
    ... 
    end 

    def create 
    current_user # returns nil 
    end 
end 

Tôi có một thẻ meta CSRF:

<meta content="xxx" name="csrf-token"> 

tôi có thể cung cấp mã hơn, nhưng tôi không chắc chắn điều gì sẽ hữu ích.

CẬP NHẬT

Vì vậy, nhờ vào các ý kiến ​​/ câu trả lời, tôi đã xác định chính xác vấn đề để một hành động cụ thể: create.

nếu tôi thêm @user = current_user vào new, tôi có thể hiển thị email của người dùng hiện tại trong chế độ xem new của tôi. Tuy nhiên, trong bộ điều khiển create của tôi, current_user trả lại nil.

Tôi đã truy cập hành động create thông qua biểu mẫu (gửi).

Trước khi gửi biểu mẫu, tôi xác thực đầu vào và sau đó gửi yêu cầu tới Stripe để lấy mã thông báo ra khỏi biểu mẫu. Nếu không có lỗi (xác thực và sọc), tôi sau đó gửi biểu mẫu.

Đó có phải là nguyên nhân không?

UPDATE 2

Trong thông báo lỗi của tôi, bãi phiên của tôi là trống, trong khi nó nên chứa các thông tin CURRENT_USER ...

+0

Mô hình của bạn dành cho người dùng có tên 'Người dùng'?vì 'current _ ***' sẽ lấy tên của mô hình. 'User_signed_in?' Trả về cái gì? – rcrmn

+0

Nó được đặt thành false ... Thật kỳ lạ vì người dùng phải được xác thực để xem trang –

Trả lời

11

Hóa ra yêu cầu AJAX mà tôi đã thực hiện không mang mã thông báo CSRF. Vì lý do đó, Rails đã giết chết phiên của tôi.

Tôi đã thêm skip_before_filter :verify_authenticity_token vào số SubscriptionsController và hiện đang hoạt động. Nó có thể không phải là giải pháp an toàn nhất, nhưng nó hoạt động ngay bây giờ, vì vậy tôi tiếp tục phát triển và quay lại vấn đề này sau.

+1

Tại sao nó không mang mã thông báo? Tôi nghĩ đôi khi tôi có thể gặp vấn đề tương tự. –

+0

@ am-rails, Đã vài tháng và tôi không nhớ chính xác. Nó chắc chắn là do cuộc gọi AJAX của tôi mặc dù ... –

2

cho current_user để làm việc bạn cần phải thêm before_filter :authenticate_user! để bạn lớp học, như:

class SubscriptionsController < ApplicationController 
    before_filter :authenticate_user! 

    def new 
    ... 
    end 

    def create 
    curent_user # returns nil 
    end 
end 

và phương pháp authenticate_user! sẽ đặt người dùng hiện tại cho bạn :)

+0

Tôi đã thử điều đó trước đây. Nó chuyển hướng người dùng đến trang đăng nhập, như thể nó chưa đăng nhập. Tôi sẽ chỉnh sửa câu hỏi của mình với nhiều thông tin hơn về điều đó sau một phút. –

+0

Vâng, vâng, ': authenticate_user!' Những gì nó làm là kiểm tra 'user_signed_in?' Và nếu nó sai, hãy đưa người dùng đến trang đăng nhập. Nó không cần thiết cho 'current_user' được khởi tạo. – rcrmn

+0

Vấn đề là, người dùng được giả sử ** được xác thực vì anh ấy đã truy cập trang. Vì vậy, trong khi 'authenticate_user!' Hiển thị vấn đề, nó không trực tiếp giải quyết nó. Rất hữu ích để xác định lỗi, mặc dù. –

3

Lưu ý rằng khi bạn tạo biểu mẫu bằng cách sử dụng trình trợ giúp form_tag, họ không tự động tạo trường ẩn chứa mã thông báo xác thực CSRF. Tôi chạy vào cùng một vấn đề này với một hình thức tôi đã xây dựng bằng cách sử dụng form_tag mà đôi khi tôi thích sử dụng.

Tôi cố định vấn đề này bằng cách bao gồm những người giúp việc sau đây trong các hình thức:

<%= hidden_field_tag 'authenticity_token', form_authenticity_token %>

Đó là cơ bản một cách thủ công tạo ra các lĩnh vực tiềm ẩn bạn cần cho những thứ CSRF.

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