0

私のアプリケーションに複数のレベルのユーザーを追加しようとしていますが、これは私が思いつく可能性のあるアイデアです:

class ApplicationController < ActionController::Base

 before_filter :setup , :authorize
protect_from_forgery

 def setup
 @minimum_permission = "admin"
end  

def authorize
  perm = { admin: 3 , moderator: 2 ,  reader: 1 }
  perm.default = 0
  if    User.find_by_id(session[:user_id])
        unless perm[session[:user_permission].to_s.to_sym] >= perm[@minimum_permission.to_sym]
            redirect_to global_login_url, notice: "you need to have "+@minimum_permission+" privileges to access this page"
        end
  else
        redirect_to global_login_url, notice: "Please log in"
  end
end
end

そして私の見解では、病気は次のようなことをします:

class FieldsController < ApplicationController
skip_before_filter :authorize
# GET /fields
# GET /fields.json
def index
@minimum_permission = "moderator"
authorize
  @fields = Field.all   
  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @fields }
  end
  end
....
end

これが私のセッションコントローラーです。

 class SessionsController < ApplicationController
 skip_before_filter :authorize
  def new
  end

 def create

user = User.find_by_cpf_no(params[:cpf_no])
if user and user.authenticate(params[:password])
  session[:user_id] = user.id
  session[:user_permission] = user.permission
  session[:user_name] = user.name
  redirect_to fields_url, alert: "successfully logged in"
else
  redirect_to fields_path, alert: "Invalid user/password combination"
end
 end

 def destroy
session[:user_id] = nil
session[:user_permission] = nil
session[:user_name] = nil
redirect_to root_path, notice: "Logged out"
 end
end

これは、ログインしている人には問題なく機能します。しかし、まだログインしていない状態でインデックスにアクセスしようとすると、次のエラーが発生します。

「このアクションでは、レンダリングおよび/またはリダイレクトが複数回呼び出されました。レンダリングまたはリダイレクトのみを呼び出すことができ、アクションごとに最大1回だけ呼び出すことができます。また、リダイレクトもレンダリングもアクションの実行を終了しないことに注意してください。リダイレクト後にアクションを終了するには、「redirect_to(...)andreturn」などを実行する必要があります。

どうすればこれを修正できますか?また、複数のレベルのユーザーを処理するためのより良い方法はありますか?ありがとうございました

4

2 に答える 2

0

箱から出してすぐに必要なことを実行できる優れたライブラリがあります。カンカンを見てください。cancanのwikiには、役割ベースの承認に関するエントリもあります。

于 2012-06-24T19:41:44.413 に答える
0

したがって、どこかにビフォアフィルターまたは他のリダイレクトがあり、円を描くように送信されます。ログには、リダイレクトを試みた行の少なくとも1つが示されているはずです。まず、global_login_url(パスではありませんか?)がすべてのフィルターをスキップしていること、および関数がレンダリング後に終了し、さらに下にある別のフィルターにヒットしないことを確認することから始めます。

于 2012-06-24T22:06:16.047 に答える