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