2012-03-09 10 views
32

Tôi đang sử dụng Devise trong trang web của mình để tạo không gian tên quản trị và cung cấp chức năng tạo người dùng theo quản trị viên.
tuyến đường của tôi là như dướiray: 3 Devise signup Chuỗi bộ lọc bị tạm dừng là: require_no_authentication được hiển thị hoặc chuyển hướng

devise_for :users,:has_many => :comments, :controllers => {:sessions =>'devise/sessions',:registrations => 'devise/registrations'} do  
    get "/login", :to => "devise/sessions#new", :as => :login 

    get "/signup", :to => "devise/registrations#new", :as => :signup  

    get "/logout", :to => "devise/sessions#destroy", :as => :logout 
end 

khi tôi bấm vào add_user liên kết trong đó có signup_path gây lỗi sau:

Lỗi My

Started GET "/signup" for 127.0.0.1 at Fri Mar 09 12:49:11 +0530 2012  
Processing by Devise::RegistrationsController#new as HTML  
User Load (0.1ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 35 LIMIT 1  
Redirected to http://localhost:3000/admin  
Filter chain halted as :require_no_authentication rendered or redirected 
Completed 302 Found in 3ms (ActiveRecord: 0.1ms) 

Tôi nghĩ rằng nó sẽ đăng ký devise bộ điều khiển nhưng do dòng sau nó gây ra lỗi trong bộ điều khiển đăng ký phát sinh

prepend_before_filter :require_no_authentication, :only => [ :new, :create, :cancel ] 
+6

Bạn có chắc chắn rằng bạn không có người dùng đã đăng nhập không? Hãy thử đăng xuất (hoặc xóa cookie của miền của bạn) và xem nó có hoạt động không. –

+0

có, tôi đã đăng nhập với tư cách quản trị viên và quản trị viên có thể thêm người dùng để thêm trang người dùng (đăng ký) có thể được mở và không được chuyển hướng đến localhost: 3000/admin. –

+0

như tôi đã nói tôi nghĩ rằng vấn đề là prepend_before_filter: require_no_authentication,: only => [: new,: create,: cancel]. tôi nên có phương pháp require_no_authentication trong helper của tôi? –

Trả lời

30

Dòng được đề cập trên Bộ điều khiển của Devise có ý nghĩa trong các trường hợp chung: người dùng đã đăng nhập không thể đăng ký. Trong trường hợp bạn chỉ quản trị viên có thể tạo người dùng, tôi khuyên bạn không nên sử dụng bộ điều khiển của Devise trên mô-đun Registerable và viết bộ điều khiển của riêng bạn với các quy tắc của riêng bạn. Bạn có thể viết nó dựa trên bộ điều khiển của Devise chỉ thay đổi dòng được đề cập.

Nếu bạn muốn sử dụng, hãy thử bỏ qua before_filter với skip_before_filter. Tôi không nghĩ đó là giải pháp tốt nhất. và tôi sẽ viết bộ điều khiển riêng của mình.

8

Tôi đã nhận được lỗi sau trong nhật ký phát triển của mình.

Filter chain halted as :require_no_authentication 

Một vòng lặp vô tận được tạo ra vì after_sign_in_path_for devise trong application_controller.rb được chuyển hướng trở lại trang trước đó với

stored_location_for(resource) 

dấu hiệu đá quý lập mưu ở người dùng khi mật khẩu được chỉnh sửa.

6

Giống như bạn, tôi muốn người dùng Quản trị viên có thể thêm người dùng mới. Nhưng tôi không muốn gây rối với Devise Registerable, vì tôi thực sự muốn người dùng vẫn có thể tự đăng ký. Tôi có một số người dùng quản trị có quyền thêm người dùng mới, vì vậy tôi đã tạo các phương thức bổ sung trong trình điều khiển người dùng và các chế độ xem bổ sung để xử lý trường hợp đó.

Phương thức bổ sung của tôi không được tham chiếu bởi prepend_before_filter của Devise: require_no_authentication, vì vậy chúng không gặp lỗi.

công thức của tôi:

Trong app/controllers/users_controller.rb (hoặc bất kỳ đối tượng bạn đang sử dụng đưa ra cho): Sao chép mới, tạo và cập nhật các phương pháp và đổi tên bản sao để admin_new, admin_create, và admin_update .

Trong app/views/người dùng, sao chép new.html.erb để admin_new.html.erb thay đổi một phần để tham khảo admin_form thay vì hình thức:

<%= render 'admin_form' %> 

Sau đó copy _form.html.erb phần để _admin_form.html.erb. Trong _admin_form.html.erb, thay đổi form_for để sử dụng một URL khác:

form_for(@user, :url => '/users/admin_create') 

Thêm tuyến đường trong cấu hình/tuyến đường.rb để trỏ đến các phương pháp thay thế trong bộ điều khiển sử dụng:

devise_scope :user do 
    ... 
    get 'users/admin_new' => 'users#admin_new' 
    post 'users/admin_create' => 'users#admin_create' 
end 

Bây giờ bạn có thể thêm người dùng trong khi bạn đang đăng nhập bằng cách vào/người dùng/admin_new, và người dùng vẫn có thể tạo ra dùng riêng của họ (đăng ký) sử dụng cơ chế đưa ra mà bạn không bị quấy rầy.

+0

Cách giải quyết của bạn giải quyết được một vấn đề lớn với tôi, Luật Don. Cảm ơn! –

5

Hi guys Tôi có một giải pháp đơn giản hơn:

prepend_before_filter :require_no_authentication, only: [:cancel ] 

Bằng cách loại bỏ :new, :create từ prepend_before_filter nó sẽ ghi đè đưa ra mã nguồn và giải quyết vấn đề. Tôi đã có cùng một vấn đề và nó giải quyết vấn đề của tôi.

+0

một lớp lót. 1 để được gọn gàng – Jerome

+0

@antoine nơi để thêm mã này ?? u có thể giải thích thêm một chút –

+1

@pawankumar Có một phương pháp để quản lý đăng ký Devise bằng cách sử dụng một 'lớp RegistrationsController Jerome