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

时间:2012-03-09 09:09:12

标签: ruby-on-rails-3 redirect devise render

我在我的网站中使用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

当我点击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 ]

5 个答案:

答案 0 :(得分:31)

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

如果您想使用它,请尝试使用before_filter跳过skip_before_filter。我不认为这是最好的解决方案。我会写自己的控制器。

答案 1 :(得分:8)

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

Filter chain halted as :require_no_authentication

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

stored_location_for(resource)

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

答案 2 :(得分:6)

和您一样,我希望管理员用户能够添加新用户。但我不想弄乱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' %>

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

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在登录时添加用户,并且用户仍然可以使用您未受干扰的设计机制创建自己的用户(注册)。

答案 3 :(得分:5)

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

prepend_before_filter :require_no_authentication, only: [:cancel ]

通过从:new, :create中删除prepend_before_filter,它会覆盖设计源代码并解决问题。我有同样的问题,它解决了我的问题。

答案 4 :(得分:0)

我还注意到,在我的应用程序中,当我创建一个用户并以该用户身份登录时,以上消息由Rails服务器控制台显示,并且我被重定向到Rails localhost默认窗口“是的,您在Rails上”。

这是因为未定义任何页面来使用已登录的用户。当我在文件夹“ views”下的“ welcome”文件夹中定义了欢迎页面“ index.html.erb”时,登录成功并且成功了。你可以试试看。