RSpec でテストできるのに、コントローラーから .json.erb ファイルをレンダリングするのが最悪です。api_docs/index.json.erb と次のコントローラーがあります。
class ApiDocsController < ApplicationController
respond_to :json
def index
render file: 'api_docs/index.json.erb', content_type: 'application/json'
end
end
明示的なrender file
行は不要のようですが、そうしないと、render template: 'api_docs/index.json.erb'
「Missing template api_docs/index」というエラーが表示されます。同様に、ファイル名を渡さなければならない場合、正確なディレクトリを指定しなければならないのはさらに面倒です。Rails は、私の ApiDocsController テンプレートが api_docs ディレクトリにあることを認識している必要があります。
render file
またはがあればrender template
、期待どおり、ページにアクセスして index.json.erb ファイルの JSON コンテンツを取得できます。ただし、この RSpec テストは失敗します。
let(:get_index) { ->{ get :index } }
...
describe 'JSON response' do
subject {
get_index.call
JSON.parse(response.body)
}
it 'includes the API version' do
subject['apiVersion'].should_not be_nil
end
end
行で失敗し、JSON.parse(response.body)
Iraise response.body
の場合、空の文字列です。コントローラーで行うrender json: {'apiVersion' => '1.0'}.to_json
と、テストは問題なくパスします。
では、/api_docs に移動したときに ( .json
URL の最後に配置する必要なく) JSON テンプレートを常にレンダリングし、ブラウザーと RSpec テストの両方で機能するようにするにはどうすればよいでしょうか? render
また、ビューのフルパスを渡す長い呼び出しを行わなくても、テンプレートをレンダリングできますか?