2012-03-09 11 views
32

Używam Devise w mojej witrynie Tworzę obszar nazw administratora i daje funkcjonalność tworzenia użytkownika przez administratora.
moje drogi są podrails: 3 Uwierzytelnianie rejestracji Łańcuch filtrów zatrzymany jako: require_no_authentication renderowany lub przekierowywany

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 

po kliknięciu na add_user linku który ma signup_path powoduje następujący błąd:

Mój błąd

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) 

myślę, że idzie do rejestracji opracować kontroler, ale z powodu następującego wiersza powoduje błąd w opracowaniu kontrolera rejestracji

+6

Czy jesteś pewien, że nie masz zalogowanego użytkownika? Spróbuj wylogować się (lub wyczyścić pliki cookie Twojej domeny) i sprawdzić, czy działa. –

+0

tak, zalogowałem się jako administrator, a administrator może dodać użytkownika, więc strona użytkownika (rejestracja) może być otwarta i nie przekierowana na localhost: 3000/admin. –

+0

jak powiedziałem i myślę, że problem to prepend_before_filter: require_no_authentication,: only => [: new,: create,: cancel]. powinienem mieć metodę require_no_authentication w moim helper? –

Odpowiedz

30

Wspomniana linia kontrolera Devise's ma sens w ogólnych przypadkach: zalogowany użytkownik nie może się zarejestrować. Ponieważ znajdujesz się w sytuacji, w której tylko administrator może utworzyć użytkownika, sugerowałbym, abyś nie używał kontrolera Devise w module Registerable i nie pisał swojego kontrolera z własnymi regułami. Możesz napisać to na podstawie kontrolera Devise'a zmieniającego tylko wspomnianą linię.

Jeśli chcesz z niego korzystać, pomiń before_filter z skip_before_filter. Nie sądzę, że to najlepsze rozwiązanie. i napisałbym własny kontroler.

8

Otrzymałem następujący błąd w moim logu rozwoju.

Filter chain halted as :require_no_authentication 

nieskończonej pętli powstał ponieważ after_sign_in_path_for opracować w application_controller.rb zostało przekierowanie z powrotem do poprzedniej strony z

stored_location_for(resource) 

opracować za gem oznaczeń użytkownika, gdy hasło jest edytowany.

6

Tak jak Ty, chciałem, aby administrator mógł dodawać nowych użytkowników. Ale nie chciałem zadzierać z Devise Registerable, ponieważ chciałem, aby użytkownicy nadal mogli się zarejestrować. Mam kilku administratorów z uprawnieniami do dodawania nowego użytkownika, więc utworzyłem dodatkowe metody w moim kontrolerze użytkowników i dodatkowe widoki do obsługi tego przypadku.

Moje dodatkowe metody nie są przywoływane przez Devise's prepend_before_filter: require_no_authentication, więc nie dostają błędu.

Mój przepis:

W app/controllers/users_controller.rb (lub cokolwiek obiekt używasz do opracowania): Skopiuj nowy, tworzenie i aktualizacja metod i zmienić nazwę kopii do admin_new, admin_create i admin_update .

w APP/views/użytkowników, skopiuj new.html.erb do admin_new.html.erb Zmień częściowego odnoszą się do admin_form zamiast postaci:

<%= render 'admin_form' %> 

skopiuj częściową _form.html.erb do _admin_form.html.erb. W _admin_form.html.erb zmień opcję form_for na inny adres URL:

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

Dodaj trasy w config/routes.rb aby wskazywały alternatywnych metod kontrolera użytkownika:

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

Teraz można dodać użytkowników, podczas gdy jesteś zalogowany, przechodząc do/users/admin_new, a użytkownicy są jeszcze w stanie tworzyć własne użytkownika (zarejestrować) za pomocą mechanizmu wykrywania, który nie przeszkadzał.

+0

Twoje obejście rozwiązało dla mnie duży problem, Don Law. Dzięki! –

5

Cześć chłopaki mam jeszcze prostsze rozwiązanie:

prepend_before_filter :require_no_authentication, only: [:cancel ] 

Usuwając :new, :create z prepend_before_filter zastępuje on opracowanie kodu źródłowego i rozwiązać problem. Miałem ten sam problem i rozwiązał mój problem.

+0

jedna wkładka. +1 za zwięzłość – Jerome

+0

@antoine gdzie dodać ten kod ?? możesz wyjaśnić nieco więcej –

+1

@pawankumar Istnieje metoda zarządzania rejestracjami Devise za pomocą 'class RegistrationsController Jerome