2011-11-23 37 views
1

我只是想知道是否有可能在請求主體完成時向請求主體傳遞信息的條件,我懷疑條件是否可以做到這一點,並且即使他們可以做到也是正確的地方,因爲這意味着他們做的條件邏輯,但是授權例子也重定向所以它的關注點模糊......一個例子是這樣的:在Sinatra條件和請求塊之間共享數據

set(:get_model) { |body| { send_to_request_body(Model.new(body)) } } 

get '/something', :get_model => request.body.data do 
    return "model called #{@model.name}" 
end 

以上是所有psudocode任何難過語法/拼寫錯誤,但這個想法是我可以有一個條件,它提取模型並將其放入某個局部變量以供身體使用,或者用錯誤或其他方法停止。

我相信過濾器(之前/之後)將是一個更好的方式來做到這一點,如果它可以完成,但從我所看到的,我將需要設置每個路由,而條件我只會需要將其作爲請求的一個選項。

與前一個例子是:

before '/something' do 
    @model = Model.new(request.body.data) 
end 

get '/something' do 
    return "model called #{@model.name}" 
end 

這是偉大的,但可以說,我現在有20條航線,其中18需要這些模型創建,我需要過濾器之前,基本上覆制所有18個,併爲他們編寫相同的模型邏輯,這就是爲什麼我試圖找到更好的方式來重新使用這個功能。如果我可以做一個全能的過濾器,可以檢查給定的路線是否有選項設置,那麼這可能會起作用,但不知道你是否可以做到這一點。

在ASP MVC中,您可以使用過濾器來完成這種事情,這正是我理想的做法,某種方式可以配置特定的路由(在路由定義中),在事先做一些工作並將其傳遞給調用塊。

回答

2

條件可以設置實例變量和修改params哈希表。有關示例,請參閱內置的user_agent條件。

set(:get_model) { |body| condition { @model = Model.new(body) } } 

get '/something', :get_model => something do 
    "model called #{@model.name}" 
end 

您應該知道request在該點不可用。

+0

啊,看起來像什麼後,這感覺就像一個黑客,但現在應該罰款。當你說我無法掌握請求時,我是否仍然可以通過@params [:body]或其他方法獲得請求主體?如果不是,那麼這將是一個交易斷路器:(​​但是,這是超出了這個問題的範圍 – Grofit

+0

對不起,再次發佈,這不是100%的話題,但我寫了一段代碼一段時間後檢查一個cookie自定義條件,這似乎工作正常使用request.cookies.has_key?xxxx。如果你不能使用該範圍內的請求不應該工作... – Grofit

+1

在'condition'塊,你有權訪問' request'。但是,當'get'/ something',:get_model => request.body.data'被評估時,你不需要。 –

0

辛納特拉有before and after filters支持:

before do 
    @note = 'Hi!' 
    request.path_info = '/foo/bar/baz' 
end 

get '/foo/*' do 
    @note #=> 'Hi!' 
    params[:splat] #=> 'bar/baz' 
end 

after '/create/:slug' do |slug| 
    session[:last_slug] = slug 
end 
+0

是的我知道,我在上面提到它。但是要做到這一點,您需要執行2個路由定義,一個用於實際請求主體塊,另一個用於before塊。我只想要一個可重複使用的過濾器,可以被所有的*使用,如果它有一個選項定義,將編輯最初的帖子在這一點上更清晰。 – Grofit