Montowanie aplikacji Sinatra wewnątrz aplikacji rails i udostępnianie układu
Chciałbym zamontować aplikację sinatra w mojej aplikacji rails. Ale chciałbym, aby ten miał ten sam układ.
Iframe może działać, ale masz jakiś inny pomysł ?
Thanks
3 answers
W zasadzie musisz zrobić dwie rzeczy:
Musisz powiedzieć routerowi Rails, że pewna ścieżka URL ma być obsługiwana przez inną aplikację Rack (w Twoim przypadku aplikację Sinata). Można to zrobić, dodając to do swoich tras.rb:
match "/sinatra" => MySinatraApp, :anchor => false
Po zrobieniu tego, możesz stworzyć swoją aplikację w ten sposób:
class MySinatraApp < Sinatra::Base
get "/" do
"Hello Sinatra World"
end
end
Drugim krokiem jest polecenie Twojej aplikacji Sinatra, aby używała układu rails, który domyślnie mieszka w app/views/layouts/application.html.erb
dla Rails 3.1. domyślnie Sinatra używa ./views/layout.ext
(z ext
jako rozszerzeniem wybranego przez Ciebie systemu szablonów). Więc w zasadzie, musisz powiedzieć Sinatrze, aby
- użyj innego katalogu, aby znaleźć widoki i układy zamiast domyślnego
./views
- użyj innego pliku szablonu jako domyślnego układu.
Oba można osiągnąć, ustawiając następujące ustawienia w aplikacji sinatra:
set :views, "/path/to/your/railsapp/views"
set :erb, layout => :"layout/application" # or whatever rendering engine you chose
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-07 12:28:21
Aby współdzielić ten sam układ, możesz skierować Sinatrę do folderu, w którym znajduje się układ w Twojej aplikacji rails: (wzięte stąd: http://www.sinatrarb.com/configuration.html )
: views-widok katalogu szablonu ciąg znaków określający katalog gdzie znajdują się szablony widoków. Domyślnie zakłada się, że jest to katalog o nazwie "views" w katalogu głównym aplikacji (Zobacz the: root setting). Najlepszy sposób na określenie alternatywnego katalogu nazwa w obrębie głównym celem aplikacji jest użycie wartości odroczonej odwołuje się do :root setting:
set :views, Proc.new { File.join(root, "templates") }
Z Twojej aplikacji Rails możesz zbudować metodę, którą możesz wywołać z akcji, w której aplikacja sinatra powinna być włączona do widoku. (biorąc pod uwagę, że chcesz użyć akcji index)
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
Zobacz jak działa rest-client tutaj: https://github.com/archiloque/rest-client i nie zapomnij dodać klejnotu do swojej aplikacji rails.
Aby używać linków w swojej aplikacji powinieneś zdecydować, czy sinatra ma się tym zająć (wskaż sinatra app (z portem) lub zbuduj linki w swojej aplikacji sinatra, które są obsługiwane przez Twoją aplikację rails)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-01 07:46:51
Myślę, że użycie append_view_path
w Twojej aplikacji rails będzie działać trochę lepiej. Po prostu dodaj widoki Sinatry do swojej aplikacji Rails i będzie tam wyglądać po zaglądnięciu w app/views.
Książka Crafting Rails applications autorstwa José Valima zawiera wiele dokumentacji na ten temat( renderowanie widoków z innych źródeł).
Również ten Railscasts może pomóc: http://railscasts.com/episodes/222-rack-in-rails-3
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-03 06:17:51