1

我对 Sinatra 还很陌生(比如 < 5 小时前),我注意到我的帖子上有一个模式(以及其他关键字)

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,如果不发送错误”......我该如何干燥这个东西?我绝对会感谢您的帮助。

4

3 回答 3

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
于 2013-08-21T06:45:15.553 回答
0

我能够做到这一点,不同型号的一个功能。我所说的splat是这个。我不确定这是否是正确的方法,因为我在正则表达式方面不是很好,所以我用 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

结尾

于 2013-08-21T23:29:23.307 回答
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
于 2013-08-20T23:12:08.300 回答