render を 2 回呼び出すことはできません。これが問題 1 です。また、1 つの要求に対して 2 つの応答を送信することもできません。
また、HTML のレンダリング (新しいページの読み込みを意味します) と JSON の送信 (AJAX 要求、つまりページをリロードしない要求) を同時に行うことには意味がありません。ありえないですし、できたとしても無意味です。
特定のレイアウトを使用するようリクエストに伝えたい場合は、レイアウト オプションをレンダリング呼び出しに渡すことができます。ただし、レンダリング呼び出しは、最初の引数としてデータ オブジェクトを使用せず、ビュー名を使用するか、オプション ハッシュのみを使用します。したがって、これを正しく呼び出すには、次を使用する必要があります。
render :index, :layout => 'example'
これにより、HTML ビューが正しく表示されると思います。
ただし、レイアウト オプションは、JSON 応答ではなく、HTML 応答でのみ有用であることを理解してください。レイアウトは、アクションが呼び出すビューをラップする外側の HTML をレンダー呼び出しに伝えます。指定しない場合は、「application.html」を使用します。
もう 1 つ理解を助けるために: 応答ブロックは、さまざまな種類の要求に応答する方法をコンピューターに指示しています。分電盤のようなものです。if/else ステートメントで記述した場合、次のようになります。
if request_type == 'html'
render :index, :layout => 'wide'
elsif request_type == 'json'
render :json => @vacancies
else
raise raise ActionController::UnknownFormat
end
したがって、respond_with ブロックを使用して、html render 呼び出しを修正し、localhost で開発していると仮定すると、ブラウザーに次の URL を入力して Enter キーを押すと...
http://localhost:3000/vacancies
これは、HTML 形式の GET リクエストを作成することであり、ページをロードしますlayout: 'wide'
が、他のデータはロードしません。次のように入力します。
http://localhost:3000/vacancies.json
これは JSON リクエストをシミュレートし、データの JSON 表現だけを取得し@vacancies
ます。
問題の解決に役立つことを願っています。そうでない場合は、何を達成しようとしているのかを詳しく説明してください。その方法を理解するのに役立ちます。
layout
PS: 最後のヒント: コントローラー レベルでレイアウトを指定する場合は、次のようにコントローラーの上部で呼び出すことができます。
class ExampleController < ApplicationController
layout 'awesome', :only => [:new,:edit]
...
end
これは他のフィルターと同様に機能し、:only または :except を渡すことも、オプションをまったく渡さないこともできます。