Chciałbym zainstalować aplikację Sinatra w mojej aplikacji rails. Ale chciałbym, aby ten miał ten sam układ.Aplikacja Mount Sinatra wewnątrz aplikacji szyny i układ udostępniania
Iframe może działać, ale czy masz jakiś inny pomysł?
Dzięki
Chciałbym zainstalować aplikację Sinatra w mojej aplikacji rails. Ale chciałbym, aby ten miał ten sam układ.Aplikacja Mount Sinatra wewnątrz aplikacji szyny i układ udostępniania
Iframe może działać, ale czy masz jakiś inny pomysł?
Dzięki
Zasadniczo trzeba zrobić dwie rzeczy:
Trzeba powiedzieć router Rails, że pewna ścieżka URL ma być obsługiwane przez inną aplikację Rack (w twój przypadek w aplikacji Sinata). Można to zrobić poprzez dodanie tego do routes.rb:
match "/sinatra" => MySinatraApp, :anchor => false
Uczyniwszy to, można stworzyć swoją aplikację tak:
class MySinatraApp < Sinatra::Base
get "/" do
"Hello Sinatra World"
end
end
Drugim krokiem teraz jest, aby poinformować aplikację Sinatrę użyj układu szyn, który domyślnie znajduje się w app/views/layouts/application.html.erb
dla Rails 3.1. domyślnie Sinatra używa ./views/layout.ext
(z ext
będącym rozszerzeniem wybranego przez ciebie systemu szablonów).Więc w zasadzie, trzeba powiedzieć Sinatrę do
./views
Oba mogą być osiągnięte poprzez ustawienie następujących w Sinatra app:
set :views, "/path/to/your/railsapp/views"
set :erb, layout => :"layout/application" # or whatever rendering engine you chose
dzielić ten sam układ, można wskazać Sinatra do folderu, w którym układ jest w swojej aplikacji szyn: (zaczerpnięte stąd: http://www.sinatrarb.com/configuration.html)
: Widoki - widok szablonu directory Ciąg znaków określający katalog , w którym znajdują się szablony widoku. Domyślnie przyjmuje się, że jest to katalog o nazwie "views" w katalogu głównym aplikacji (zobacz ustawienie: root). Najlepszym sposobem, aby określić alternatywny katalog nazwę w katalogu głównym aplikacji jest użycie wartości odroczonego która odwołuje się do: ustawienie root:
set :views, Proc.new { File.join(root, "templates") }
z aplikacji Rails można zbudować metodę, która cię może wywoływać z akcji, w której aplikacja Sinatra powinna być zawarta w widoku. (podane chcesz użyć indeksu dla tego działania)
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
zobaczyć jak reszta-klient pracuje tutaj: https://github.com/archiloque/rest-client i nie zapomnij podać klejnot w Twojej aplikacji Rails.
Aby użyć łącza w Sinatra aplikacji należy zdecydować, czy Sinatra powinien obsługiwać ten (Point to Sinatra app (z portu) lub zbudować łącza w Sinatra aplikacji, które są obsługiwane przez aplikację szyn)
Bardzo ładny trik, myślę, że jedynym problemem jest to, że może być powolna http – Mike
myślę, że korzystanie z aplikacji append_view_path
w twojej aplikacji railsowej będzie działać trochę lepiej. Wystarczy dodać widoki Sinatra do swojej aplikacji Rails i będzie wyglądać tam po obejrzeniu aplikacji/widoków.
Książka "Crafting Rails Applications" José Valima zawiera wiele dokumentacji na ten temat (renderowanie widoków z innych źródeł), możesz na to spojrzeć.
Również ten Railscasts może pomóc: http://railscasts.com/episodes/222-rack-in-rails-3
Kwestia jest taka, że nie można Sinatra obsłużyć pomocników szyn, których używam w układzie szyn (i różnych wtyczkach szyn) – Mike
Cóż, może powinieneś trzymać się Railsów. Piękno Sinatry polega na tym, że przychodzi bez wielu rzeczy, których nie potrzebujesz w pewnych środowiskach. Ale jeśli masz już infrastrukturę, której potrzebujesz (pomocników, wtyczek, ...), nie ma sensu pozostawiać tego za sobą. Skorzystaj z Sinatry dla obszarów, które mogą stać na własną rękę. –
Oczywiście po prostu chciałem zbudować mini-rozszerzenie do mojej aplikacji, które może być wielokrotnego użytku przez wiele aplikacji rack. Ale pozostanę przy silnikach szynowych. – Mike