Я хотел бы установить приложение sinatra в моем приложении rails. Но я хотел бы, чтобы этот один разделил один и тот же макет.
iframe может работать, но есть ли у вас какая-либо другая идея?
Спасибо
Я хотел бы установить приложение sinatra в моем приложении rails. Но я хотел бы, чтобы этот один разделил один и тот же макет.
iframe может работать, но есть ли у вас какая-либо другая идея?
Спасибо
Вам в основном нужно сделать две вещи:
Вам нужно указать маршрутизатору 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
чтобы разделить один и тот же макет, вы можете указать 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)
Я думаю, что использование append_view_path
в вашем приложении rails будет работать немного лучше. Просто добавьте представления Sinatra к вашему Rails-приложению, и он будет выглядеть там после просмотра в приложениях/представлениях.
В книге прикладных рельсов Crafting Rails от José Valim есть много документации по этой теме (рендеринг представлений из других источников), вы можете посмотреть на это.
Кроме того, этот Railscasts может помочь: http://railscasts.com/episodes/222-rack-in-rails-3