2011-07-28 21 views

Odpowiedz

37

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

  1. użycia innego katalogu znaleźć poglądy i układy zamiast domyślnego ./views
  2. użyć innego pliku szablonu jako układ domyślny.

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 
+0

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

+2

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ę. –

+0

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

3

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)

+1

Bardzo ładny trik, myślę, że jedynym problemem jest to, że może być powolna http – Mike

1

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

Powiązane problemy