【问题标题】:Mount Sinatra app inside a rails app and sharing layout在 Rails 应用程序中安装 Sinatra 应用程序并共享布局
【发布时间】:2011-08-07 20:28:21
【问题描述】:

我想在我的 rails 应用程序中安装一个 sinatra 应用程序。 但我希望这个共享相同的布局。

iframe 可以工作,但您还有其他想法吗?

谢谢

【问题讨论】:

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


    【解决方案1】:

    你基本上需要做两件事:

    您需要告诉 Rails 路由器某个 URL 路径将由另一个 Rack 应用程序(在您的情况下为 Sinata 应用程序)处理。这可以通过将其添加到您的 routes.rb 来完成:

    match "/sinatra" => MySinatraApp, :anchor => false
    

    完成后,您可以像这样创建您的应用程序:

    class MySinatraApp < Sinatra::Base
      get "/" do
        "Hello Sinatra World"
      end
    end
    

    现在的第二步是告诉您的 Sinatra 应用程序使用 Rails 布局,Rails 3.1 默认位于 app/views/layouts/application.html.erb 中。默认情况下,Sinatra 使用./views/layout.extext 是您选择的模板系统的扩展名)。所以你基本上,必须告诉 Sinatra

    1. 使用另一个目录来查找视图和布局,而不是默认的./views
    2. 使用另一个模板文件作为默认布局。

    两者都可以通过在您的 sinatra 应用程序中设置以下内容来实现:

    set :views, "/path/to/your/railsapp/views"
    set :erb, layout => :"layout/application" # or whatever rendering engine you chose
    

    【讨论】:

    • 这里的问题是 Sinatra 无法处理我在 Rails 布局中使用的 Rails 助手(以及各种 Rails 插件)
    • 好吧,那么也许你应该坚持使用 Rails。 Sinatra 的美妙之处在于它没有太多你在某些环境中不需要的东西。但是,如果您已经拥有所需的基础架构(帮助程序、插件等),那么将其抛在脑后并没有多大意义。将 Sinatra 用于可以独立站立的区域。
    • 当然,我只是想为我的应用构建一个迷你扩展,它可以被多个机架应用重用。但我会坚持使用 Rails 引擎。
    • 根据您实际想要实现的目标,您也可以尝试使用机架中间件。您可以让您的 Rails 应用程序使用某些关键字发出您的页面,然后在过滤器链中稍后由您的中间件替换这些关键字。如果你做复杂的事情,这是不干净的,但对于简单的、独立的事情,它可能没问题。
    【解决方案2】:

    要共享相同的布局,您可以将 sinatra 指向您的 rails 应用程序中布局所在的文件夹: (取自这里:http://www.sinatrarb.com/configuration.html

    :views - 查看模板目录 指定目录的字符串 视图模板所在的位置。默认情况下,这被假定为 应用程序根目录中名为“views”的目录(参见 :root 设置)。指定替代目录的最佳方式 应用程序根目录中的名称是使用延迟值 引用 :root 设置:

      set :views, Proc.new { File.join(root, "templates") }
    

    从您的 Rails 应用程序中,您可以构建一个方法,您可以从应将 sinatra 应用程序包含在视图中的操作调用该方法。 (假设您想为此使用索引操作)

    def index
      @sinatra_content = get_sinatra
    end
    # use @sinatra_content in your views for rendering
    
    def get_sinatra
       sinatra_ip = 127.0.0.1;
       sinatra_port = 4567;
       #start a request here
       RestClient.get 'http://#{sinatra_ip}:{sinatra_port}/', {:params => {:id => 50, 'foo' => 'bar'}}
    end
    

    在此处查看 rest-client 的工作原理:https://github.com/archiloque/rest-client,并且不要忘记将 gem 包含在您的 rails 应用程序中。

    要在您的 sinatra 应用程序中使用链接,您应该决定 sinatra 是否应该处理此问题(指向 sinatra 应用程序(带有端口)或在您的 sinatra 应用程序中构建由您的 rails 应用程序处理的链接)

    【讨论】:

    • 非常好的技巧,我认为唯一的问题是http可能很慢
    【解决方案3】:

    我认为在 Rails 应用程序中使用 append_view_path 会更好一些。只需将 Sinatra 视图附加到您的 Rails 应用程序,它就会在查看 app/views 后出现。

    José Valim 的 Crafting Rails Applications 一书有很多关于该主题的文档(从其他来源渲染视图),您可能想看看。

    此外,这个 Railscasts 可以提供帮助:http://railscasts.com/episodes/222-rack-in-rails-3

    【讨论】:

      猜你喜欢
      • 2012-02-26
      • 2017-03-25
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 2013-01-03
      • 2018-02-28
      • 2018-01-01
      • 1970-01-01
      相关资源
      最近更新 更多