【问题标题】:Before Filter on a rack ( sinatra ) based app in RoR applications在 RoR 应用程序中基于机架 (sinatra) 的应用程序上过滤之前
【发布时间】:2014-04-04 12:29:04
【问题描述】:

我有一个 sinatra 应用程序,安装在我的 rails 应用程序中。

match "/my_sinatra_app" => MyApp, :anchor => false

有没有办法在过滤所有/my_sinatra_app url 上的rails 之前执行Rails。 ?

【问题讨论】:

  • 您可以在 sinatra 应用程序中定义前置过滤器。有什么理由不使用该功能?
  • 我正在使用此 gem github.com/ejschmitt/delayed_job_web 并希望拥有自己的身份验证,因此希望使用 before_filter 重定向用户。这颗宝石在 sinatra 中,我的应用是 rails

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 sinatra


【解决方案1】:

这是一个老问题,但我在 Sidekiq Web 上遇到了类似的问题。

为了解决这个问题,我们可以使用route constraints

在您的路由文件中将路由限制到已安装的应用程序:

require "sidekiq/web"
mount Sidekiq::Web, at: "/sidekiq", constraints: AdminConstraint.new

然后在AdminConstraint 中,您需要发出before_filter 中适用于您的应用程序身份验证的调用。例如,如果我的ApplicationController 中有以下内容:

class ApplicationController < ActionController::Base
  before_filter :authenticate

  def authenticate
    user = User.find_by(email: params[:email])

    if user && user.authenticate(params[:password])
      session[:user_id] = user.id
    end
  end
end

我会在约束中加入以下内容:

class AdminConstraint
  def matches?(request)
    return false unless request.session[:user_id]

    user = User.find(request.session[:user_id])

    # Only show if user is a super admin
    user.present? && user.super_admin?
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    相关资源
    最近更新 更多