2011-01-11 36 views
41

Tôi có một biểu mẫu nơi tôi thu thập nhiều thông tin trong Rails. Một phần của biểu mẫu này là các trường để người dùng mới đăng ký. Vì Devise có bộ điều khiển/hành động cụ thể để tạo người dùng mới, tôi không biết cách tạo lập trình người dùng theo cách lập trình theo một hành động hoàn toàn khác mà cũng tạo một bản ghi khác. Tôi thực sự không thể có biểu mẫu đăng ký người dùng riêng biệt. Tôi không thể tìm ra cách tạo người dùng và sau đó đăng nhập người dùng, như tôi có thể dễ dàng thực hiện trong Authlogic.Cách tạo thủ công phiên người dùng và người dùng mới trong Devise?

Tôi đã sử dụng cả Authlogic và Devise và nghĩ rằng mỗi điểm đều có điểm mạnh và điểm yếu. Với Devise, tôi thích cách nhanh chóng "đi" với một dự án mới, nhưng tùy biến nó có vẻ là một nỗi đau. Authlogic đã có rất nhiều vấn đề với Rails 3 một thời gian trở lại, mà tôi chuyển sang Devise. Tôi hiện đang làm việc trên một dự án mới và bắt đầu từ đầu. Vì vậy, tôi nghĩ rằng có 2 câu trả lời tiềm năng cho câu hỏi này: (a) làm thế nào để làm điều này trong Devise, hoặc (b) tại sao tôi nên chỉ cần chuyển sang Authlogic với Rails 3 để thay thế.

+0

Câu trả lời được chấp nhận của bạn hoạt động cho cả Devise và Authlogic. –

Trả lời

76

Bạn có thể tạo một người dùng lập mưu mới chỉ đơn giản bằng cách tạo ra một mô hình người dùng mới (xem https://github.com/plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interface)

@user = User.new(:email => '[email protected]', :password => 'password', :password_confirmation => 'password') 
@user.save 

Để đăng nhập vào user mới tạo của bạn, sử dụng sign_in @user

+0

Mã chính xác tương tự cũng hoạt động cho Authlogic (Tôi đang chạy phiên bản 1.4.4.1). –

+0

là tài liệu hướng dẫn cho điều này .. như thế nào mà người ta biết rằng một hàm có tên sign_in tồn tại – codeAnand

+2

Bạn có thể thấy nó trong phần "người trợ giúp thử nghiệm" trong readme tại https://github.com/plataformatec/devise Cụ thể hơn , bạn có thể xem tài liệu tại đây: http://rubydoc.info/github/plataformatec/devise/master/frames –

7

Tiết kiệm user mới tạo trước sign_in sẽ thất bại vì không có các trường được yêu cầu cho đối tượng User. Vì vậy, mã của David sẽ hoạt động cho trang hiện tại, nhưng trang tiếp theo sẽ không nhận được người dùng đã đăng nhập, vì người dùng chỉ được lưu sau khi phiên được đặt. Điều này xảy ra khi tôi sử dụng Mongoid, và tôi không biết nếu nó là một vấn đề cụ thể cho Mongodb.

Để giải quyết vấn đề này, tôi có một giải pháp rất không hoàn hảo để gọi sign_in hai lần. Dấu hiệu đầu tiên sẽ lưu người dùng. Nó chỉ hoạt động nhưng mọi người có thể cải thiện nó chắc chắn.

@user = User.new(:email => '[email protected]', 
       :password => 'password', 
       :password_confirmation => 'password') 
# This will save the user in db with fields for devise 
sign_in @user 
# :bypass is set to ignore devise related callbacks and only save the 
# user into session. 
sign_in @user, :bypass => true 
+2

Tôi có thể hỏi nếu sự cố vẫn xảy ra nếu bạn lưu người dùng một cách rõ ràng trước khi gọi sign_in? Và nếu điều đó không có tác dụng, hãy thêm một cuộc gọi để tải lại người dùng sau khi lưu nhưng trước khi sign_in? – m3z

4

Đối với những người mới nhìn thấy câu hỏi này ...

Một cách đơn giản để làm điều này là trong bạn

config/routes.rb 

bạn nên có một dòng như sau:

devise_for :users 

vì vậy, bạn chỉ cần thêm tiền tố đường dẫn tạo ra sẽ sử dụng:

devise_for :users, :path_prefix =>'auth' 

Hy vọng điều đó sẽ hữu ích!

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