2

アプリでDevise + CanCan + Rolifyを承認および認証ソリューションとして使用しています。

管理者は、アプリのダッシュボードからすべてのユーザー アクセス管理を行っています。したがって、「admin_dashboard.index.html」ファイル内からすべての Devise ビュー リンクにアクセスしようとしています。

このアプリでユーザーコントローラーを作成しました

ここに 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

他のユーザーが既にログインしているときに、ユーザーを作成したときに、登録コントローラーをオーバーライドし、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 に答える
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 Devise signup :require_no_authentication がレンダリングまたはリダイレクトされたため、フィルターチェーンが停止しました

カスタム登録コントローラーを使用してデバイスをセットアップする

于 2012-06-17T02:34:48.267 に答える