【问题标题】:Sinatra on Rails '/' mappingSinatra on Rails '/' 映射
【发布时间】:2012-07-07 22:39:37
【问题描述】:

我可能遗漏了一些东西,但是如何在 Rails 中映射“/”来执行 Sinatra 应用程序?我有:

class Core < Sinatra::Base

 get '/' do
  "This is root but it is caput."
 end

 get '/test' do
  "This is test and it works"
 end

end

所以如果我这样路由:

match '/test' => Core
match '/'=>Core

只有 '/test' 触发 Sinatra 应用程序 '/' 运行 Rails。实际上我希望每条路线都由 Sinatra 应用程序处理。

【问题讨论】:

  • 这与 Rails 有什么关系?
  • 只是为了确定:您是否从公用文件夹中删除了index.html? :)
  • 谢谢@padde。删除 index.html 有效。
  • @kwicher:那么请接受我的回答,这样其他面临这个问题的人可以找到快速的解决方案;)

标签: ruby-on-rails routes sinatra


【解决方案1】:

您只需从public 文件夹中删除index.html

您可以使用mount Core, :at =&gt; '/' 挂载整个应用程序,以便让 Sinatra 完成所有路由。

【讨论】:

  • 如果我需要 Sinatra 处理所有请求怎么办。我是否需要将 routes.rb 中的每一个都映射到匹配的 sinatra 中。
  • 我必须承认我从未将 Sinatra 与 Rails 一起使用,但是当您希望 Sinatra 处理所有路由时,为什么不设置一个普通的 Sinatra 应用程序?
  • 这就是问题所在。我需要将我的 Sinatra 应用程序转移到不允许将 Sinatra 作为独立应用程序运行但我可以运行 Rails 的 ISP。
  • 也许一个简单的match "/*" =&gt; Core 就可以了?
  • 我找到了解决方案。在 routes.rb 中,我只输入了mount Core, :at =&gt; '/'
【解决方案2】:

鉴于 Sinatra 创建了一个用于定义路由的 DSL(不能作为方法直接访问),您可能需要添加一个辅助方法,以便您可以专门调用该路由: 即

  def launch_sinatra_app
    status, headers, body = call env.merge("PATH_INFO" => '/')
    [status, headers, body.map(&:upcase)] # proper rack response
  end

然后在 config/routes.rb 中获取 rails:

match :root => 'Core#launch_sinatra_app'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2011-08-12
    • 1970-01-01
    相关资源
    最近更新 更多