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
レイアウトを指定したときに部分適用を探すのはなぜですか。正しいレイアウトを適用するにはどうすればよいですか。
ありがとう
編集
それが言うドキュメントを読む
「パーシャルのレイアウトは、通常のパーシャルと同じリーディングアンダースコアの命名に従い、それらが属するパーシャルと同じフォルダーに配置されることに注意してください(マスターレイアウトフォルダーではありません)。」
しかし、デフォルトのレイアウトを適用したい
コントローラでの部分レンダリングは、リロードせずにページ上の1つまたはいくつかの要素のみを更新するAjax呼び出しと一緒に最も一般的に使用されます。コントローラーからのパーシャルのレンダリングにより、フルページレンダリング(テンプレート内から呼び出すことによる)とサブページの更新が発生したとき(Ajax呼び出しに応答するコントローラーアクションから)の両方で同じパーシャルテンプレートを使用できます。デフォルトでは、現在のレイアウトは使用されません。
これが、コードが機能しない理由である可能性があり、レンダリングテンプレートを使用できます。
テンプレートレンダリングは、テンプレートルートを基準にしたパスを取ることを除いて、アクションレンダリングと同じように機能します。現在のレイアウトが自動的に適用されます。
if resource.company_form
render :template => "shared/company_signup_form"
else
render :template => "shared/individual_signup_form"
end
**これをテンプレートとして使用しているため、partail名からUNDERSCOREを削除してください。
これがうまくいくことを願っています!
結局(そして私はこれがハックであることを知っています)、レイアウト/アプリケーションファイルの正確なコピーである_partial_layout_wrapperと呼ばれるパーシャルをレイアウトに作成し、これをコントローラーで使用しました
render partial: 'shared/company_signup_form', layout: 'partial_layout_wrapper'
これは機能しますが、確かにこれは方法ではありませんか?
コントローラ全体を投稿していただけますか? 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を探しています