2

我在我的应用程序中使用 Devise + CanCan + Rolify 作为授权和身份验证解决方案。

管理员正在我的应用程序中从他们的仪表板进行所有用户访问管理。所以我试图从我的“admin_dashboard.index.html”文件中访问所有的设计视图链接

我在这个应用程序中创建了一个用户控制器

这是 admin_dashboard_index.html.erb 文件

<table id="users_index_table" %>
  <tr>
 <th>id</th>
     <th>user name</th>
 <th>user email</th>
 <th>user role</th>
     <th>reset password</th> 
 <th></th> 
 <th></th> 
 <th></th>  

  </tr>
<% @users.each do |user| %>
  <tr>
 <td><%= user.name %></td>
 <td><%= user.email %></td>
     <td><%= user.roles  %></td>
 <th><%= link_to 'reset password', edit_user_password_path %></th> 
 <td><%= link_to  %></td>
     <td><%= link_to 'Show', user %></td>
     <td><%= link_to 'Edit', edit_user_path(user) %></td>
     <td><%= link_to 'Destroy', user, confirm: 'Are you sure?', method: :delete %></td>
  </tr>
 <% end %>
 </table>
 <%= link_to 'New User', new_user_registration_path %>

现在的问题是当我点击这些“用户”链接时,除了“new_user_registration_path”之外的所有工作。当我单击它时,它会引导我进入应用程序的主页,并且 rails 服务器会显示以下跟踪:

 Started GET "/users/sign_up" for 127.0.0.1 at 2012-06-16 18:24:49 -0700
 Processing by Devise::RegistrationsController#new as HTML
 User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
Redirected to http://localhost:3000/
Filter chain halted as :require_no_authentication rendered or redirected
Completed 302 Found in 2ms (ActiveRecord: 0.5ms)

我怎样才能让新用户链接和“edit_user_password_path”工作并将我路由到适当的字段而不是主页。

谢谢

4

2 回答 2

4

根据服务器输出,似乎有一个过滤器不允许您在已登录时创建新用户(:require_no_authentication)。在研究了设计的设置方式之后,他们的注册控制器上确实有一个前置过滤器,该过滤器需要未经身份验证的会话才能创建新的用户注册。

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

如果您的用户控制器是从 Devise::RegistrationsController 继承的,那么您可以完全跳过过滤器:

skip_before_filter :require_no_authentication, :only => [:new, :create]

或者您可以编写自己的 :require_no_authentication 方法来检查登录用户是管理员还是普通用户。您可以将此方法放在用户控制器的底部:

protected

def require_no_authentication
    if current_user.is_admin?
        return true
    else
        return super
    end
end

如果您的控制器不是从 Devise::RegistrationsController 继承的,那么您需要在设置路由时指定您的自定义控制器。

devise_for :users, :controllers => { :registration => "my/controller" }

然后显然实现您自己的“新”方法。

我发现了一些与此问题相关的现有堆栈溢出问题:

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

使用自定义注册控制器设置设备

于 2012-06-17T02:34:48.267 回答
4

当我创建用户时,我覆盖了一个注册控制器,并注释了 sign_up 行,而其他用户已经登录

class RegistrationsController < Devise::RegistrationsController            
  skip_before_filter :require_no_authentication                            
  def create                                        

    build_resource

    if resource.save
      if resource.active_for_authentication?
        set_flash_message :notice, :signed_up if is_navigational_format?
        # sign_up(resource_name, resource)
        respond_with resource, :location => after_sign_up_path_for(resource)
      else
        set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
        expire_session_data_after_sign_in!
        respond_with resource, :location => after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords resource
      respond_with resource
    end
  end
end

并改变路线

devise_for :users, :controllers => { :registrations => "registrations" }
于 2012-12-19T12:52:26.557 回答