2015-05-24 55 views
1

我想用Sinatra創建一個簡單的實驗性MVC框架。如何將路線映射到Sinatra中的控制器?

我想用的名字"pages"定義的資源例如應該下定決心:

/pages (index) 
/pages/new 
/pages/:id/show (show) 

以及地圖app/controllers/PagesController.rb相應get('/')負責索引,post('/pages/create')負責創作,等等

麻煩甚至在閱讀官方文檔後我非常困惑。我想我需要爲此使用非經典的Sinatra模型,但是任何人都可以將我指向正確的方向嗎?

謝謝

+0

*與相應的get('/')'*,你是不是指'get('/ pages')'? –

+0

是的,這就是我的意思。本質上,我如何模仿Rails用控制器做什麼? –

回答

5

如果你想要我認爲你想要的東西,我一直這麼做。最初對於這個方案我使用了travis-api源作爲參考,但基本上你想要做的是在一個「控制器」類中擴展Sinatra :: Base,然後在機架上安裝你的個人Sinatra「控制器」,像這樣:

module Endpoint 
    def self.included(base) 
    base.class_eval do 
     set(:prefix) { "/" << name[/[^:]+$/].downcase } 
    end 
    end 
end 

class Users < Sinatra::Base 
    include Endpoint 

    get '/' do 
    #logic here 
    end 

    get '/:id' do 
    #logic here 
    end 

    post '/' do 
    #logic here 
    end 

    patch '/:id' do 
    #logic here 
    end 
end 

class Posts < Sinatra::Base 
    include Endpoint 

    post '/' do 
    #logic here 
    end 
end 

,然後是這樣的:

class App 
    require "lib/endpoints/users" 
    require "lib/endpoints/posts" 

    attr_reader :app 

    def initialize 
    @app = Rack::Builder.app do 
     [Users, Posts].each do |e| 
     map(e.prefix) { run(e.new) } 
     end 
    end 
    end 

    def call(env) 
    app.call(env) 
    end 
end 

您可以調整這個爲任何你需要的,但這個想法是一樣的,你的應用分成每個有前綴組合的西納特拉應用它們使用機架安裝。這個特殊的例子會給你的路線爲:

得到'/用戶

得到 '/用戶/:身份證'

郵報 '/用戶'

補丁「/用戶/:ID '

get'/ posts'

+0

Just fyi,你可以通過調用'run App.new'來運行這個應用程序。 – photoionized

+2

你能解釋一下'self.included(base)'是從哪裏來的?它究竟是做什麼的?謝謝 –

0

我給你在這裏一個很簡單的例子:

創建一個文件controller.rb

get '/pages' do 
    @pages = Pages.all 
    erb :pages 
end 

接下來,創建在同一文件夾格蘭控制器views目錄,創建一個名爲pages.html.erb的文件

這是您以前創建的控制器的相應視圖acti上。

在這裏,你可以輸入類似:

<% @pages.each do |p| %> 
<%= p.title %> 
<% end %> 

重新啓動服務器,請訪問:localhost:PORT/pages,你會看到你的所有網頁標題的列表。

你可以看看這個鏈接,一個簡單的辛納屈教程 - http://code.tutsplus.com/tutorials/singing-with-sinatra--net-18965

+0

爲什麼會在controller.rb中有'get()'可用? –

+0

由於我發佈的鏈接建議,你將不得不在你的控制器中包含'gem'sinatra'' – user2635088

0

您可以以此爲複雜或需要的那麼簡單。例如:

Rails使得很多魔法在引擎蓋下發生,而Sinatra更靈活,代價是要求您自己實現一些這些東西。

controller_map = { 
    'pages' => PagesController 
} 

post '/:controller/new' do 
    c = params[:controller] 
    module = controller_map[c] 
    module.create_new() 
    ... 
end 

get '/:controller/:id/show' do 
    c = params[:controller] 
    id = params[:id] 
    module = controller_map[c] 
    module.get(id) 
    ... 
end 
+0

這樣做的好處是什麼,而不是通過'map {MyController}'在'config.ru'中聲明它們? –

+0

你聲明它的地方並不重要,這個例子是爲了演示的目的。 –

相關問題