2015-10-20 92 views
0

建设铁路应用程序。我正在使用cancancan进行授权,并使用序列号来代替真实ID。 (对于漂亮的网址和简单的ID)。现在当URL是例如轨道cancancan宝石与序列宝石

/customers/1 

Cancancan正在加载ID = 1的客户,而不是使用Sequence_Number = 1加载客户。如何告诉cancancan将params [:id]映射到序列号而不是ID?

回答

1

使用find_by选项:

load_resource find_by: :sequence_number 
authorize_resource 

或覆盖CanCanCan的负荷:

class ApplicationController 
    MEMBER_ACTIONS = [:show, :edit, :update, :destroy] 
    COLLECTION_ACTIONS = [:index, :new, :create] 
end 

class CustomersController < ApplicationController 
    before_action :find_customer, only: MEMBER_ACTIONS 
    load_and_authorize_resource 

    def find_customer 
    @customer = Customer.find_by!(sequence_number: params[:id]) 
    end 
end 

CanCanCan将着眼于控制器名称并尝试加载基于名称的模式。它将模型以单一名称装入伊娃。

MovieDirectorsController -> MovieDirector.find -> @movie_director 

如果伊娃已经有一个值,则跳过load_resource