Подтвердить что ты не робот

Приложение Mount Sinatra в приложении rails и раскладке

Я хотел бы установить приложение sinatra в моем приложении rails. Но я хотел бы, чтобы этот один разделил один и тот же макет.

iframe может работать, но есть ли у вас какая-либо другая идея?

Спасибо

4b9b3361

Ответ 1

Вам в основном нужно сделать две вещи:

Вам нужно указать маршрутизатору Rails, что определенный URL-адрес должен обрабатываться другим приложением Rack (в вашем случае приложение Sinata). Это можно сделать, добавив это к вашим маршрутам. Rb:

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

Сделав это, вы можете создать свое приложение следующим образом:

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

Второй шаг теперь - сообщить вашему приложению Sinatra использовать рельсовый макет, который по умолчанию живет в app/views/layouts/application.html.erb для Rails 3.1. по умолчанию Sinatra использует ./views/layout.ext (при этом ext является расширением выбранной вами системы шаблонов). Итак, вы в основном, должны сказать Синатре, чтобы

  • используйте другой каталог, чтобы найти представления и макеты вместо стандартного ./views
  • используйте другой файл шаблона в качестве макета по умолчанию.

Оба могут быть достигнуты установкой следующего в вашем приложении sinatra:

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

Ответ 2

чтобы разделить один и тот же макет, вы можете указать sinatra в папку, где макет находится в вашем приложении rails: (взято здесь: http://www.sinatrarb.com/configuration.html)

: views - view template directory Строка, указывающая каталог где расположены шаблоны представлений. По умолчанию предполагается, что это каталог с именем "views" в корневом каталоге приложений (см. параметр: root). Лучший способ указать альтернативный каталог имя в корне приложения должно использовать отложенную стоимость который ссылается на параметр: root:

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

В приложении Rails вы можете создать метод, который вы можете вызвать из действия, в котором приложение синатра должно быть включено в представление. (если вы хотите использовать для этого действие индекса)

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.

Чтобы использовать ссылки в вашем приложении sinatra, вы должны решить, справится ли это с синатрой (укажите на приложение с синтатрой (с портом) или создайте ссылки в приложении для синатры, которые обрабатываются вашим приложением rails)

Ответ 3

Я думаю, что использование append_view_path в вашем приложении rails будет работать немного лучше. Просто добавьте представления Sinatra к вашему Rails-приложению, и он будет выглядеть там после просмотра в приложениях/представлениях.

В книге прикладных рельсов Crafting Rails от José Valim есть много документации по этой теме (рендеринг представлений из других источников), вы можете посмотреть на это.

Кроме того, этот Railscasts может помочь: http://railscasts.com/episodes/222-rack-in-rails-3