Рельсы: 3 Приостановить регистрацию Цепь фильтра остановлена ​​как: require_no_authentication, обработанная или перенаправленная

Я использую Devise на своем сайте. Я создаю пространство имен admin и предоставляю функциональность для создания пользователя по администратора.
мои маршруты равны

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

когда я нажимаю ссылку add_user, у которой signup_path вызывает следующую ошибку:

Моя ошибка

 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)

Я думаю, что это произойдет с контроллером регистрации разработки, но из-за следующей строки это вызовет ошибку при разработке контроллера регистрации

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

Ответ 1

Указанная строка в Devise Controller имеет смысл в общих случаях: зарегистрированный пользователь не может зарегистрироваться. Поскольку вы находитесь на случай, когда только администратор может создать пользователя, я бы предположил, что вы не используете контроллер Devise в модуле Registerable и пишите свой собственный контроллер своими собственными правилами. Вы можете написать его на основе контроллера Devise, изменяющего только указанную строку.

Если вы хотите использовать его, попробуйте пропустить before_filter с помощью skip_before_filter. Я не думаю, что это лучшее решение. и я бы написал свой собственный контроллер.

Ответ 2

В моем журнале разработки я получил следующую ошибку.

Filter chain halted as :require_no_authentication

Бесконечный цикл был создан, потому что devise after_sign_in_path_for в application_controller.rb перенаправлялся на предыдущую страницу с помощью

stored_location_for(resource)

При редактировании пароля выведите символы драгоценного камня у пользователя.

Ответ 3

Как и вы, я хотел, чтобы пользователь Admin мог добавлять новых пользователей. Но я не хотел связываться с Devise Registerable, так как я действительно хотел, чтобы пользователи все еще могли регистрироваться. У меня есть некоторые пользователи-администраторы с разрешением на добавление нового пользователя, поэтому я создал дополнительные методы в моем контроллере пользователей и дополнительные представления для обработки этого случая.

Мои дополнительные методы не ссылаются на Devise prepend_before_filter: require_no_authentication, поэтому они не получают ошибку.

Мой рецепт:

В приложении/контроллерах/users_controller.rb(или любом объекте, который вы используете для разработки): Скопируйте новые, создайте и обновите методы и переименуйте их в admin_new, admin_create и admin_update.

В app/views/users скопируйте файл new.html.erb в admin_new.html.erb Измените частичное, чтобы ссылаться на admin_form вместо формы:

 <%= render 'admin_form' %>

Затем скопируйте частичный _form.html.erb в _admin_form.html.erb. В _admin_form.html.erb измените форму для использования другого URL-адреса:

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

Добавьте маршруты в config/routes.rb, чтобы указать альтернативные методы в пользовательском контроллере:

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

Теперь вы можете добавлять пользователей, когда вы вошли в систему, перейдя в /users/admin _new, и пользователи все еще могут создать свой собственный пользователь (зарегистрироваться), используя механизм разработки, который вы не нарушили.

Ответ 4

Привет, ребята, я получил еще более простое решение:

prepend_before_filter :require_no_authentication, only: [:cancel ]

Удалив :new, :create из prepend_before_filter, он переопределяет исходный код и решает проблему. У меня была такая же проблема, и она решила мою проблему.