Sinatra:在CRUD期间重复代码

时间:2013-08-20 22:03:08

标签: ruby-on-rails ruby sinatra

我对Sinatra很新(比如< 5小时前),我注意到我的POST上的模式(以及其他关键词)

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,如果没有发送错误”......我该怎么干这个东西?我非常感谢你的帮助。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 :(得分:0)

我能够做到这一点,一个功能适用于不同的模型。 我所关注的是这个。我不确定这是否是正确的方法,因为我在正则表达式中不是那么好,所以我用像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