2016-07-23 3 views
-1

Ich bin ein Anfänger zu Ruby on Rails und dies ist ein Ruby on Rails, der von jemandem entwickelt wurde.Ruby on Rails ERR_TOO_MANY_REDIRECTS Fehler für eine bestimmte Benutzerrolle

Es gibt zwei Arten von Benutzern: registrierter Benutzer mit der Rolle "Benutzer" und registrierter Benutzer mit der Rolle "admin".

Diese zu viele Umleitungen geschieht nur, wenn die Rolle des Benutzers = "Benutzer", aber nicht so, wenn der Benutzer "admin" ist. Ich habe noch nicht herausgefunden warum.

Erstens, wenn der Benutzer das Admin ist, werde ich diese erhalten im Protokoll:

Started GET "/" for ::1 at 2016-07-22 18:18:17 -0700 
Processing by ProductsController#home as HTML 
    ^[[1m^[[35mUser Load (0.1ms)^[[0m SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 11]] 
controller_path: products 
resource: product 
method: product_params 
after the parms setting => ${params} 
Debugging in the Ability.rb... 
User: #<User:0x007fe6d7f0f670> 
user is admin 
    ^[[1m^[[36mProduct Load (0.3ms)^[[0m ^[[1mSELECT "products".* FROM "products"^[[0m 
    ^[[1m^[[35mVersion Load (1.1ms)^[[0m SELECT "versions".* FROM "versions" 
    ^[[1m^[[36mReltype Load (1.0ms)^[[0m ^[[1mSELECT "reltypes".* FROM "reltypes"^[[0m 

und viele weitere SQL-Anweisungen; Ich würde das gerne vereinfachen, aber das ist eine andere Frage und eine andere Lernmöglichkeit.

Wenn der Benutzer ein normaler Benutzer ist, die „Redirect“ direkt nach dem Benutzer geschehen ist regelmäßiger Benutzer

Started GET "/" for ::1 at 2016-07-22 18:25:23 -0700 
Processing by ProductsController#home as HTML 
    ^[[1m^[[36mUser Load (0.1ms)^[[0m ^[[1mSELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1^[[0m [["id", 11]] 
controller_path: products 
resource: product 
method: product_params 
after the parms setting => ${params} 
Debugging in the Ability.rb... 
User: #<User:0x007fe6d13dca88> 
user is regular user 
Redirected to http://localhost:3000/ 
Completed 302 Found in 6ms (ActiveRecord: 0.1ms) 


Started GET "/" for ::1 at 2016-07-22 18:25:23 -0700 
Processing by ProductsController#home as HTML 
    ^[[1m^[[35mUser Load (0.1ms)^[[0m SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 11]] 
controller_path: products 
resource: product 
method: product_params 
...repeat... for many more 

Meine Vermutung ist, dass die Zielseite versucht, alle Daten in dieser Seite für den Einsatz zu ziehen und jedes SQL löst eine Weiterleitung aus ... Aber zuerst möchte ich herausfinden, warum es einen Unterschied zwischen einem Benutzer mit der Rolle "Benutzer" gegenüber "Rolle" gibt. Ich werde mich später um Optimierung kümmern. Jede Hilfe wird sehr geschätzt.

Hier ist die config/routes.rb

Rails.application.routes.draw do 
    resources :groupings 
    resources :platforms 
    resources :versions 
    resources :reltypes 
    resources :products 

    # Devise stuff 
    devise_for :users 
    devise_scope :user do 
    get '/login' => 'devise/sessions#new' 
    get '/logout' => 'devise/sessions#destroy' 
    end 

    resources :users, :controller => "users" 
    unauthenticated :user do 
    resources :products, only: [:index, :show] 
    resources :versions, only: [:index, :show] 
    resources :reltypes, only: [:index, :show] 
    resources :platforms, only: [:index, :show] 
    resources :groupings, only: [:index, :show] 
    end 

    # You can have the root of your site routed with "root" 
    root to: 'products#home' 

    namespace :api, :defaults => {:format => :json} do 
    resources :platforms 
    resources :versions 
    resources :reltypes 
    resources :products 
    resources :groupings 
    end 
end 

Als nächstes Controller/application.rb

class ApplicationController < ActionController::Base 
    # include DeviseTokenAuth::Concerns::SetUserByToken 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :exception 

    # Devise: redirect to login page if user not logged in 
    before_action :authenticate_user! 

    before_filter do 
    resource = controller_path.singularize.to_sym 
    method = "#{resource}_params" 
    Rails.logger.debug("controller_path: #{controller_path}") 
    Rails.logger.debug("resource: #{resource}") 
    Rails.logger.debug("method: #{method}") 

    params[resource] &&= send(method) if respond_to?(method, true) 
    end 

    protected 

    def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:sign_up) {|u| u.permit(:email, :password, :password_confirmation, roles: [])} 
    end 

    # CanCan: if user authorization fails, catch and modify 
    check_authorization :unless => :devise_controller? 

    rescue_from CanCan::AccessDenied do |exception| 
    redirect_to root_url, :alert => exception.message 
    end 
end 

Hier ist die Modelle/user.rb

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 

    before_save :default_values 

    def default_values 
    # self.role ||= 'user' 
    self.role = "user" 
    end 

    def is?(requested_role) 
    self.role == requested_role 
    end 
end 

Schließlich Ich habe dieses Modell/activity.rb gefunden (Ich habe versucht, einige Debugging-Anweisungen hier zu setzen:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    # Define abilities for the passed in user here. For example: 
    # 
    user ||= User.new # guest user (not logged in) 
    Rails.logger.debug("Debugging in the Ability.rb...") 
    Rails.logger.debug("User: #{user}") 

    if user.is? "admin" 
     Rails.logger.debug("user is admin") 
     can :manage, :all 
    else 
     Rails.logger.debug("user is regular user") 
     can :read, :all 
    end 
    end 
end 

Die Controller/products_controller.rb hinzugefügt (wie von Sri Vishnu Totakura vorgeschlagen). Ich habe den Code für Update/Destroy übersprungen, nur um ein wenig Speicherplatz zu sparen.

class ProductsController < ApplicationController 
    load_and_authorize_resource #for CanCan 

    before_action :set_product, only: [:show, :edit, :update, :destroy] 

    # GET /products 
    # GET /products.json 
    def index 
    @products = Product.all 
    end 

    def home 
    @products = Product.all 
    @versions = Version.all 
    @platforms = Platform.all 
    @reltypes = Reltype.all 
    @prevrels = Prevrel.all 
    end 

    # GET /products/1 
    # GET /products/1.json 
    def show 
    end 

    # GET /products/new 
    def new 
    # puts "params for new: " 
    # puts params 
    @product = Product.new 
    end 

    # GET /products/1/edit 
    def edit 
    end 

    # POST /products 
    # POST /products.json 
    def create 
    puts "params for create: " 
    puts params 
    @product = Product.new(product_params) 

    respond_to do |format| 
     if @product.save 
     format.html { redirect_to @product, notice: 'Product was successfully created.' } 
     format.json { render :show, status: :created, location: @product } 
     else 
     format.html { render :new } 
     format.json { render json: @product.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    ... 
    end 

    def destroy 
    ... 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_product 
     @product = Product.find(params[:id]) 
     @versions = @product.versions 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def product_params 
     params.require(:product).permit(:name) 
    end 
end 
+0

Möglicherweise gibt es einen Code, der dies in der Aktion 'ProductsController # home' verursacht. Wäre hilfreich, wenn Sie den Code aus dem 'ProductsController' – aBadAssCowboy

Antwort

1

Es scheint, dass das Problem hier ist:

rescue_from CanCan::AccessDenied do |exception| 
    redirect_to root_url, :alert => exception.message 
end 

Aus irgendeinem Grund, wenn Sie nicht ein Admin, dass Ausnahme ausgelöst wird, und Sie fallen in eine Schleife, wie Sie ProductsController#home umleiten Das ist die root to: 'products#home'

Ich sehe nicht Ihre Produkte Controller-Code, aber das Problem sollte da sein. Gib mir Bescheid.

+0

, der gerade gepostet/hinzugefügt wurde, einfügen könnten. Vielen Dank! –

0

Da ich die Paulo Antwort nicht kommentieren oder aufwerten kann, lasse ich dies hier für jeden, der ein ähnliches Problem hat.

Seine Antwort ließ mich einen besseren Blick in meinem Controller werfen, der die unendlichen Weiterleitungen und besonders die Handlung verursachte, die ausgelöst wurde und schließlich dieses löste.

Ich benutzte devise/cancancan auch.

Konkret hatte ich eine companies_controller.rb.

Ferner wird in einem before_action ich so etwas wie die folgenden

hatte
before_action :set_company, only: :show 

und der set_company Aktion war

def set_company 
    ... 
    authorize! params[:action].to_sym, @company || Company 
end 

Sobald ich die authorise entfernt! Rufen Sie die Umleitungsschleife auf. Ich habe nicht herausgefunden, was die Schleife verursacht hat, da meine Benutzerrollen anscheinend gut waren, aber das war definitiv die Ursache.