2013-08-20 147 views
1

過程中重複的代碼,我是相當新的西納特拉(如< 6小時前),我在我的訊息注意到模式(和其他關鍵字太)西納特拉:CRUD

post '/pageant' do 
pageant = Pageant.new(params) 
if pageant.save 
    json_status 201, 'good' 
    Pageant.last.to_json 
else 
    json_status 412, 'fail' 
end 
end 

我還有其他模型:候選人,評委,類別,分數等。我覺得我會多次寫這個:獲取參數,嘗試保存,如果一切都有效(根據DataMapper),發送一個201或200並返回最後一個,否則拋出一個錯誤(json_status是引發錯誤狀態和錯誤代碼的方法)。 DELETE也會發生同樣的情況:「檢查是否刪除,如果刪除發送OK,如果不發送錯誤」...我如何幹這件事?我一定會喜歡這個幫助。

+1

只是想評論說,根據您的整體基礎設施網絡的實例/工人,併發的(數你的數據庫和驅動程序),當去'Model.save'和'Model.last'時,可能會有競爭條件,如果另一個線程/進程在這些調用之間創建了一條新記錄,那麼'Model.last'可以返回其他記錄,這可能導致各種混淆或可能構成安全/隱私泄露。 –

+0

+1,並添加到@AlistairIsrael IMO這幾乎到位。隨着應用程序的增長,您可能會對驗證失敗或其他類型的失敗的保存和備用流程產生限制。您可以將這些調用包裝在Model本身。 – ch4nd4n

+0

@AlistairIsrael好的我會記住這一點......我想我聽說在Coursera課程中基於模式的軟件體系結構...... –

回答

0

我能夠做到這一點,不同型號的一個功能。 我正在關注的圖示是這樣的。我不確定這是否是正確的方法,因爲我在Regex方面並不擅長,所以我用in_array這樣的東西做了我所能做的。我們該怎樣改進這個?

before do 
@models = ['pageant', 'round', 'category', 'candidate', 'judge', 'score', 'setting'] 
content_type :json 
end 

發佈之前爲不同型號

post '/:model/?' do 

model_name = params[:captures].first 
params.delete("splat") 
params.delete("captures") 
params.delete("model") 


if @models.include? model_name 
    model_class = Module.const_get(model_name.capitalize) 

    if model_class.new(params).save 
     json_status 201, model_class.last.to_json 
     model_class.last.to_json 
    else 
     json_status 412, 'fail' 
    end 
else 
    json_status 412, 'fail' 
end 

0

可以創建一個方法

post '/pageant' do 
    save_method(params) 
end 

post '/other' do 
    save_method(params) 
end 

def save_method(params) 
    pageant = Pageant.new(params) 
    if pageant.save 
    json_status 201, 'good' 
    Pageant.last.to_json 
    else 
    json_status 412, 'fail' 
    end 
end 
2

定義基於正則表達式路線,然後動態地實例基於HTTP路徑上的模型對象。此解決方案假定路徑名稱和型號名稱相同。

post %r{/([\w]+)} do 
    model_name = params[:captures].first.capitalize 
    save_and_return(model_name, params) 
end 

def save_and_return(model_name, params) 
    model_class = Module.const_get(model_name) 
    model = model_class.new(params) 
    if model.save 
    json_status 201, 'good' 
    model.last.to_json # Keep in mind AlistairIsrael's comment! 
    else 
    json_status 412, 'fail' 
    end 
end 
+0

嘿,我試過這個,大部分它工作正常,但爲什麼包括摔得粉碎?會發生什麼是我必須刪除圖示 –

+0

你指的是哪個圖示? –

+0

阿維萊我提出了一個答案,你可以檢查出來嗎?我無法在這個評論中很好地格式化我的代碼,所以我只是回答了一個問題。我真的很感謝幫助 –