将Sinatra应用程序安装在rails应用程序内并共享布局

时间:2011-07-28 09:07:36

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

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

iframe可以运作,但你还有其他想法吗?

由于

3 个答案:

答案 0 :(得分:38)

你基本上需要做两件事:

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

来完成
match "/sinatra" => MySinatraApp, :anchor => false

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

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

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

  1. 使用其他目录查找视图和布局,而不是默认的./views
  2. 使用另一个模板文件作为默认布局。
  3. 两者都可以通过在sinatra应用程序中设置以下内容来实现:

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

答案 1 :(得分:3)

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

  

:views - 视图模板目录指定目录的字符串   视图模板所在的位置。默认情况下,假设为a   应用程序根目录中名为“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并且不要忘记在rails应用中包含gem。

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

答案 2 :(得分:1)

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

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

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