rails:3 Devise注册过滤器链停止为:require_no_authentication呈现或重定向

urj*_*ils 33 redirect render devise ruby-on-rails-3

我在我的网站中使用Devise我创建了管理员命名空间,并通过管理员提供了创建用户的功能.
我的路线如下

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
Run Code Online (Sandbox Code Playgroud)

当我点击signup_path导致以下错误的add_user链接时:

我的错误

 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)
Run Code Online (Sandbox Code Playgroud)

我认为这是设计注册控制器,但由于跟随线它导致设计注册控制器出错

prepend_before_filter :require_no_authentication, :only => [ :new, :create, :cancel ]
Run Code Online (Sandbox Code Playgroud)

Rod*_*res 31

在一般情况下,Devise控制器上提到的行是有意义的:登录用户无法注册.当您处于只有管理员可以创建用户的情况时,我建议您不要在Registerable模块上使用Devise的控制器,并使用自己的规则编写自己的控制器.您可以根据Devise的控制器编写它,仅更改上述行.

如果你想使用它,试着跳过before_filterskip_before_filter.我不认为这是最好的解决方案.我会写自己的控制器.


Nat*_*at8 8

我在开发日志中收到以下错误.

Filter chain halted as :require_no_authentication
Run Code Online (Sandbox Code Playgroud)

创建了一个无限循环,因为application_controller.rb中的devise的after_sign_in_path_for重定向回到上一页

stored_location_for(resource)
Run Code Online (Sandbox Code Playgroud)

编辑密码时,Devise的gem在用户中签名.


小智 6

和你一样,我希望Admin用户能够添加新用户.但我不想弄乱Devise Registerable,因为我实际上希望用户仍能够自己注册.我有一些管理员用户有权添加新用户,因此我在用户控制器中创建了其他方法以及其他视图来处理这种情况.

Devise的prepend_before_filter:require_no_authentication没有引用我的其他方法,因此它们不会收到错误.

我的食谱:

在app/controllers/users_controller.rb(或您正在使用的任何对象)中:复制新的,创建和更新方法,并将副本重命名为admin_new,admin_create和admin_update.

在app/views/users中,将new.html.erb复制到admin_new.html.erb更改partial以引用admin_form而不是form:

 <%= render 'admin_form' %>
Run Code Online (Sandbox Code Playgroud)

然后将部分_form.html.erb复制到_admin_form.html.erb.在_admin_form.html.erb中,将form_for更改为使用其他URL:

form_for(@user, :url => '/users/admin_create')
Run Code Online (Sandbox Code Playgroud)

在config/routes.rb中添加路由以指向用户控制器中的备用方法:

devise_scope :user  do
    ...
    get  'users/admin_new' => 'users#admin_new'
    post 'users/admin_create' => 'users#admin_create'
end
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过转至/ users/admin_new在登录时添加用户,并且用户仍然可以使用您未受干扰的设计机制创建自己的用户(注册).


Ant*_*ine 5

大家好,我有一个更简单的解决方案:

prepend_before_filter :require_no_authentication, only: [:cancel ]
Run Code Online (Sandbox Code Playgroud)

通过消除:new, :createprepend_before_filter它的重写设计源代码,并解决问题.我有同样的问题,它解决了我的问题.