Rails Engine为所有父控制器创建类似于before_filter的方法

时间:2014-09-06 01:07:48

标签: ruby-on-rails ruby devise rubygems rails-engines

我正在尝试在Devise和CanCan之间建立一个Rails Gem。不像Devise那么复杂,但有视图和控制器。

我已经创建了一个方法,可以添加到父应用程序的任何控制器的顶部,几乎完全像Devise的before_action :authenticate_user!和CanCan的load_and_authorize_resource

如果不满足要求,我需要redirect_to已安装路径中的路径的方法。

  module MyEngine
    module ControllerAdditions
      extend ActiveSupport::Concern

      module ClassMethods
        def pin_verified
          current_user ||= nil
          @pinned = current_user.nil? ? nil : current_user
          redirect_to setup_mobiles_path unless @pinned && @pinned.verified?
        end
      end
    end
  end

并在我的spec/dummy/app/controllers/users_controller.rb

class UsersController < ApplicationController
  pin_verified

  def index
    @users = User.all
  end
end

pin_verified正在被调用,但我得到以下错误:

undefined local variable or method `setup_mobiles_path' for UsersController:Class

关于我应该怎么做的任何想法?

====编辑====

我现在改变了这个来提出一个自定义异常,但现在我需要拯救那个异常,然后重定向到所需的路径。

def pin_verified
  current_user ||= nil
  @pinned = current_user.nil? ? nil : current_user
  unless @pinned && @pinned.verified?
    raise ValidatedPinExpired
  end
end

我尝试将它添加到我的gem的ApplicationController中,但它似乎根本没有击中Controller。

module MyEngine
  class ApplicationController < ActionController::Base
    rescue_from Exception do |exception|
      Rails.logger.info "==== exception: #{exception} ===="
      redirect_to setup_mobiles_path
    end
  end
end

0 个答案:

没有答案