Ruby on rails 过滤器内包裹

Ruby on rails 过滤器内包裹,ruby-on-rails,Ruby On Rails,使用Rails 3.2。我试图通过检查用户对所有crud操作的权限来保护我的应用程序。以下是其中一个例子: class StatesController < ApplicationController def create @country = Country.find(params[:country_id]) if can_edit(@country) @state.save else redirect_to country_pat

使用Rails 3.2。我试图通过检查用户对所有crud操作的权限来保护我的应用程序。以下是其中一个例子:

class StatesController < ApplicationController  
  def create
    @country = Country.find(params[:country_id])
    if can_edit(@country)
      @state.save
    else
      redirect_to country_path
    end
  end

  def destroy
    @country = Country.find(params[:country_id])
    if can_edit(@country)
      @state = State.find(params[:id])
      @state.destroy
    else
      redirect_to country_path
    end
  end
end

class ApplicationController < ActionController::Base
  def is_owner?(object)
    current_user == object.user
  end

  def can_edit?(object)
    if logged_in?
      is_owner?(object) || current_user.admin?
    end
  end
end
class StatesController
我注意到我已经在许多控制器中包装了
can\u edit?
。有什么方法可以做到这一点吗


注意:所有这些都必须包含一个对象,以检查登录用户是否为所有者。

您正在查找授权库。您应该了解哪些允许设置特定用户或用户组可以访问哪些对象的特定规则

它有一个方法,
load\u和\u authorize\u resource
,您可以在给定的控制器中调用该方法。因此,您的雕像控制器看起来像:

class StatesController < ApplicationController
  load_and_authorize_resource :country

  def create
    @state.save
  end

  def destroy
    @state = State.find(params[:id])
    @state.destroy
  end
end
class StatesController

CanCan将首先加载国家/地区并确定用户是否有权查看此资源。否则,它将引发一个错误(您可以在该控制器或ApplicationController中拯救该错误,以返回适当的响应”。)然后,您可以在任何控制器操作中访问
@country
,知道用户有权这样做。

我最初使用CanCan,但发现我无法轻松自定义错误重定向,它不太灵活。因此我决定手动操作。为此,请使用Rails rescue\u from方法: