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

Author: Mike, 2011-07-28

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

  1. użyj innego katalogu, aby znaleźć widoki i układy zamiast domyślnego ./views
  2. 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
 38
Author: Holger Just,
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)

 3
Author: ben,
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

 1
Author: Hock,
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