1

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 に移動したときに ( .jsonURL の最後に配置する必要なく) JSON テンプレートを常にレンダリングし、ブラウザーと RSpec テストの両方で機能するようにするにはどうすればよいでしょうか? renderまた、ビューのフルパスを渡す長い呼び出しを行わなくても、テンプレートをレンダリングできますか?

4

2 に答える 2

0

実際respond_to :jsonには、コントローラーで既に使用しているため、renderメソッドを使用してテンプレートを選択できます。おそらくご存知のように、テンプレートにコントローラーメソッドと同じ名前が付けられている場合は、メソッド全体を抑制できるはずですrender

行を削除するとrender、結果はどうなりますか?

于 2013-09-04T18:38:55.047 に答える