我正在从Rails提供版本化的Web服务。
我非常希望能够像平常一样调用渲染:
render 'index'
并正确地提供以下所请求的版本:
index.v1.json.jbuilder
index.v2.json.jbuilder
index.v3.json.jbuilder
假设我已经在控制器动作执行的上下文中知道了所请求的版本,我如何让render()来利用它?
答案 0 :(得分:3)
答案 1 :(得分:0)
听起来像构建器设计模式可能在这里工作。拥有一个返回所需行为的视图构建器对象。
module ViewBuiler
def build(name, api_version)
View.new(name, api_version).build
end
class View < Struct(:name, :api_version)
def build
[name, api_version, 'json', 'jbuilder'].join('.')
end
end
end
在您的控制器中,您可以执行以下操作:
ApplicationController
include ViewBuilder
end
MyController < ApplicationController
def index
...
# you can pass either strings or symbols to build and it will
# return 'index.v1.json.jbuilder'
render build(:index, params[:api_version])
end
end
免责声明,这只是一个想法,而不是我已实施的内容。我喜欢这种方法有两个原因。 Controller操作仍然很瘦,并且没有逻辑。像这样的建设者似乎很容易测试。并且它可以将可能发生变化的事物(视图等)隔离成可以经常更改的内容,只要它保留了控制器可以使用的界面。
答案 2 :(得分:0)
这似乎是Variants的候选人。这是4.1的新功能。
class MyController < ActionController::Base
before_action :set_variant
def my_action
.....
respond_to do |format|
format.json do |json|
json.v1 do
# render whatever you need here
end
end
end
end
protected
def set_variant
request.variant = :v1 if request.params[:version] == "v1"
....
end
end