【问题标题】:Sinatra rack middleware hijacks '/' root urlSinatra 机架中间件劫持 '/' 根 url
【发布时间】:2012-03-02 13:08:06
【问题描述】:

我正在尝试在我的 Rails 应用中使用 Sinatra 应用作为中间件。

我在 Rails 应用程序的 /lib 文件夹中测试了一个基本的 Sinatra 应用程序,used 中间件并设置了路由。效果很好。

我想要做的是提取 Sinatra 应用程序并将其作为 gem 包含在内。这样我就可以独立运行 Sinatra 应用程序,或者在多个 Rails 应用程序中使用它。

Sinatra 应用程序

# myrackapp/lib/myrackapp.rb
module Myrackapp
  class Application < Sinatra::Base

    set :root, File.dirname(__FILE__)

    get "/" do
      "Rack Home"
    end

    get '/rackroute' do
      "Hello, Rack Page"
    end

    end
end

Myrackapp 也有一个gemspec——那里没什么有趣的,但如果有必要我可以发帖。

Rails 应用程序

# Gemfile
gem 'myrackapp', path: "/Users/gareth/Code/myrackapp"

-

# config/application.rb
module Myrailsapp
  class Application < Rails::Application
    ...
    config.middleware.use "Myrackapp::Application"
  end
end

-

# config.routes.rb
root :to => 'pages#show', :id => 'home'
mount Myrackapp::Application => "/rackapp"

这是我的rake middleware 输出:

    rake middleware
    use ActionDispatch::Static
    use Rack::Lock
    use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x141ded4>
    use Rack::Runtime
    use Rack::MethodOverride
    use ActionDispatch::RequestId
    use Rails::Rack::Logger
    use ActionDispatch::ShowExceptions
    use ActionDispatch::DebugExceptions
    use ActionDispatch::RemoteIp
    use ActionDispatch::Reloader
    use ActionDispatch::Callbacks
    use ActiveRecord::ConnectionAdapters::ConnectionManagement
    use ActiveRecord::QueryCache
    use ActionDispatch::Cookies
    use ActionDispatch::Session::CookieStore
    use ActionDispatch::Flash
    use ActionDispatch::ParamsParser
    use ActionDispatch::Head
    use Rack::ConditionalGet
    use Rack::ETag
    use ActionDispatch::BestStandardsSupport
    use Myrackapp::Application
    run Myrailsapp::Application.routes

当我转到 http://myapp.dev/rackapp 时,我得到 Myrackapp 的根路径 - 正确的行为

当我转到 http://myapp.dev/rackapp/rackroute 时,我得到 Myrackapp 的 /rackroute 路径 - 再次,正确的行为

问题

当我在浏览器中转到 http://myapp.dev 时,我会被定向到 Myrackapp 的根路径。

当我将 Sinatra 应用程序直接包含在我的 Rails 应用程序中时,访问 http://myapp.dev 会呈现正确的 pages#show 操作。

如何让 Sinatra 应用不劫持 Rails 的根路径?

【问题讨论】:

    标签: ruby-on-rails sinatra rack rack-middleware


    【解决方案1】:

    您实际上并不需要将 Sinatra 应用程序作为中间件来执行您想要的操作。

    将它作为中间件包括在内意味着所有请求都通过它进行路由,您不需要/不需要它来提供路由。

    如果您想在将 gem 包含在 rails 应用程序中时自动添加路由,您可以添加一个 railtie 来将路由添加到应用程序。我不记得那是什么样子了,但应该很简单。

    【讨论】:

    • 很有趣,谢谢。 slimmer 在这种情况下仍然可以使用它吗?
    • 好问题 - 我不确定安装在 rails 中的 sinatra 应用程序如何与中间件交互。我知道 slimmer 适用于常规的 sinatra 应用程序 - 我们在 github.com/alphagov/rummager 中使用它,但还没有尝试过以这种方式设置。如果你有麻烦,也许你可以把你的工作放在 github 上?我很乐意和它一起玩。
    • 那太棒了,谢谢。我会在早上将它们添加到github。
    • 经过今天的更多黑客攻击后,我认为您对中间件的错误做法是正确的。我已将 the rails 和 rack 应用程序添加到我的 Github。 seems like its possible 到 append_view_path 同时从 ActionController::Metal 继承,所以我想这可能是如何做到的。
    • 另一种选择(或可能的方法)是定义一个 Railtie,它创建一个设置 append_view_path 的 rails 引擎
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多