如何制作这个Sinatra代码DRYer?

时间:2014-06-05 20:45:14

标签: ruby sinatra

这些是我的Sinatra路线。他们将商店名称作为ActiveRecord类传递,并使用我的帮助程序执行所需的params。

def self.get_or_post(url,&block)
  get(url,&block)
  post(url,&block)
end

get_or_post "/read" do
  jsonp(read(params[:store].constantize, params))
end

get_or_post "/create" do
  jsonp(create(params[:store].constantize, params))
end

get_or_post "/update" do
  jsonp(update(params[:store].constantize, params))
end

get_or_post "/destroy" do
  jsonp(destroy(params[:store].constantize, params))
end

在我看来,这可以让DRYer做类似的事情:

case route
when read, create, update, destroy
  jsonp(method(route).call(params[:store].constantize, params))
else
  # neglect or give error
end

如何获取此路径变量,我使用method(route).call是否正确?

1 个答案:

答案 0 :(得分:1)

怎么样:

%w(read create update destroy).each do |action|
  [:get, :post].each do |method|
    send(method, "/#{action}") do
      jsonp(send(action, params[:store].constantize, params))
    end
  end
end