如何自定义Rails 4 render()查找文件的方式?

时间:2014-02-17 20:58:01

标签: ruby-on-rails web-services ruby-on-rails-4 render versioning

我正在从Rails提供版本化的Web服务。

我非常希望能够像平常一样调用渲染:

render 'index'

并正确地提供以下所请求的版本:

index.v1.json.jbuilder
index.v2.json.jbuilder
index.v3.json.jbuilder

假设我已经在控制器动作执行的上下文中知道了所请求的版本,我如何让render()来利用它?

3 个答案:

答案 0 :(得分:3)

我使用了versioncake gem

你一定要看看这个。文件名将与您的文件名非常接近:

index.v1.json.jbuilder

将是

index.json.v1.jbuilder

答案 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