【问题标题】:How to get a named route from a Rack app hosted in Rails 3?如何从 Rails 3 中托管的 Rack 应用程序获取命名路由?
【发布时间】:2011-08-04 08:26:10
【问题描述】:

当应用程序安装在 rails 3(在我的情况下是 Sinatra 应用程序)中时,是否可以在自定义机架应用程序中获取命名路由的值?

只需使用路由,(login_path) 就会为未定义的局部变量抛出异常。

更新:

这是我正在尝试做的一个示例:

before do
 redirect login_path unless some_condition
end

应用已安装

mount App.new, :at => '/path'

这部分按预期工作。

谢谢, 斯科特

【问题讨论】:

  • 我没试过这个,但是当你运行 rake routes 时它们不会被列出来吗?
  • 请告诉我们您的应用程序是如何挂载的。
  • @Ryan - 我的应用程序安装了 mount App.new, :at => '/path' 这按预期工作。我的问题是如何在我的应用程序中实际使用命名路由。我会用一个更好的例子来更新我最初的问题。

标签: ruby-on-rails ruby-on-rails-3 routes rack


【解决方案1】:

在挂载的 Sinatra 中访问托管 rails 应用程序的路由可能不是很优雅,因为托管的 Sinatra 不应该知道托管它的应用程序。

因此,最好在 rails 应用程序中执行此操作。

如果你使用设计,你可以像这样围绕你的安装块:

authenticate "user" do
  mount App.new, :at => '/path'
end

这是可以做到的,因为设计本身就是在路由之前添加的中间件。

Devise 将其实现为:

def authenticate(scope)
  constraint = lambda do |request|
    request.env["warden"].authenticate!(:scope => scope)
  end
  constraints(constraint) do
    yield
  end
end

如果你不使用设计,你可能需要实现类似的东西。

【讨论】:

    【解决方案2】:

    我认为这是不可能的,因为它们有单独的代码。你只是告诉 Rails 对某些路径做什么,它会将这些请求路由到 另一个机架应用,它们不共享任何有关内部代码的信息。

    也许您可以编写一些代码来告诉 Sinatra 如何读取 Rails 路线。一个很好的起点:

    http://apidock.com/rails/ActionDispatch

    【讨论】:

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