0

空室コントローラーがあり、@vacancies を json に渡し、別のレイアウトもレンダリングする必要があります。次のコードは機能しません (json は渡されませんが、「ワイド」レイアウトです)。format.html { render layout: "wide"} }を削除すると、json が正しく渡されます。これら2つのことをどのように組み合わせるのですか?

class VacanciesController < ApplicationController
respond_to :html, :json
...
    def index
      @vacancies = Vacancy.all
      respond_with(@vacancies) do |format|
       format.html { render layout: "wide"} }
       format.json { render json: @vacancies } 
      end
     end
  ...
4

1 に答える 1

3

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ます。

問題の解決に役立つことを願っています。そうでない場合は、何を達成しようとしているのかを詳しく説明してください。その方法を理解するのに役立ちます。

layoutPS: 最後のヒント: コントローラー レベルでレイアウトを指定する場合は、次のようにコントローラーの上部で呼び出すことができます。

class ExampleController < ApplicationController
  layout 'awesome', :only => [:new,:edit]
  ...
end

これは他のフィルターと同様に機能し、:only または :except を渡すことも、オプションをまったく渡さないこともできます。

于 2013-02-10T01:29:55.583 に答える