Rails cancancan宝石与序列宝石

时间:2015-10-20 20:08:20

标签: ruby-on-rails cancancan

构建rails app。我使用cancancan进行授权和测序gem,使用序列号而不是真实的ID。 (对于不错的网址和更简单的ID' s)。现在当网址是例如

/customers/1

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

1 个答案:

答案 0 :(得分: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将查看控制器名称并尝试根据名称加载模型。它将模型加载到具有单数名称的ivar中。

MovieDirectorsController ->  MovieDirector.find -> @movie_director

如果ivar已有值,则跳过load_resource