web-dev-qa-db-ja.com

Railsコントローラーでの部分レンダリングとレイアウト

Devise RegistrationsControllerの作成アクションをオーバーライドしています。サインアップには、個人または会社の2つのフォームがあります。会社には、2つのフォームを区別するtrueに設定されたcompany_formというフィールドがあります。

フォームの検証時に、正しいフォームをレンダリングしたいと思います(以前は、使用しているフォームに関係なく、デフォルトのフォームに戻っていました)。

パーシャルだけがレンダリングされるという問題があります(パーシャルのみをレンダリングしているので明らかです)が、レイアウト/アプリケーションファイルもレンダリングする必要があります。

class RegistrationsController < Devise::RegistrationsController
  def create
  <!-- Other devise code here -->
    if resource.company_form
      render partial: 'shared/company_signup_form'
    else
      render partial: '/shared/individual_signup_form'
    end
  end
end

私が試してみました

if resource.company_form
    render partial: 'shared/company_signup_form', layout: 'layouts/application'
  else
    render partial: '/shared/individual_signup_form', layout: 'layouts/application
  end

しかし、私はエラーが発生します

Template is missing
Missing partial layouts/_application 

レイアウトを指定したときに部分適用を探すのはなぜですか。正しいレイアウトを適用するにはどうすればよいですか。

ありがとう

編集

それが言うドキュメントを読む

「パーシャルのレイアウトは、通常のパーシャルと同じリーディングアンダースコアの命名に従い、それらが属するパーシャルと同じフォルダーに配置されることに注意してください(マスターレイアウトフォルダーではありません)。」

しかし、デフォルトのレイアウトを適用したい

11
Richlewis

コントローラでの部分レンダリングは、リロードせずにページ上の1つまたはいくつかの要素のみを更新するAjax呼び出しと一緒に最も一般的に使用されます。コントローラーからのパーシャルのレンダリングにより、フルページレンダリング(テンプレート内から呼び出すことによる)とサブページの更新が発生したとき(Ajax呼び出しに応答するコントローラーアクションから)の両方で同じパーシャルテンプレートを使用できます。デフォルトでは、現在のレイアウトは使用されません。

これが、コードが機能しない理由である可能性があり、レンダリングテンプレートを使用できます。

テンプレートレンダリングは、テンプレートルートを基準にしたパスを取ることを除いて、アクションレンダリングと同じように機能します。現在のレイアウトが自動的に適用されます。

if resource.company_form
   render :template => "shared/company_signup_form"
else
   render :template => "shared/individual_signup_form"   
end

**これをテンプレートとして使用しているため、partail名からUNDERSCOREを削除してください。

これがうまくいくことを願っています!

7

結局(そして私はこれがハックであることを知っています)、レイアウト/アプリケーションファイルの正確なコピーである_partial_layout_wrapperと呼ばれるパーシャルをレイアウトに作成し、これをコントローラーで使用しました

render partial: 'shared/company_signup_form', layout: 'partial_layout_wrapper'

これは機能しますが、確かにこれは方法ではありませんか?

3
Richlewis

コントローラ全体を投稿していただけますか? Rails別のレイアウトが指定されていない場合、デフォルトでlayout /application.html.erbがレンダリングされます。

Rorガイドから:

部分的なレイアウト

ビューがレイアウトを使用できるのと同じように、パーシャルは独自のレイアウトファイルを使用できます。たとえば、次のようにパーシャルを呼び出すことができます。

<%= render partial: "link_area", layout: "graybar" %>

これにより、_link_area.html.erbという名前の部分が検索され、レイアウト_graybar.html.erbを使用してレンダリングされます。パーシャルのレイアウトは、通常のパーシャルと同じリーディングアンダースコアの命名に従い、それらが属するパーシャルと同じフォルダーに配置されることに注意してください(マスターレイアウトフォルダーではありません)。

また、:layoutなどの追加オプションを渡す場合は、:partialを明示的に指定する必要があることに注意してください。

そう render partial: 'shared/company_signup_form', layout: 'layouts/application'はlayouts/_application.html.erbを探しています

1