アプローチ1:隠しフィールドで選択を永続化する
<li><%= link_to "Sign up", new_user_registration_path %></li>
<li><%= link_to "Are you a Medical Professional?", new_user_registration_path(medical: true) %></li>
ルートのパラメータを使用して、迅速な解決策を得ることができます。new_user_registrations_path(medical: true)
結果として、ルートに)が追加され?medical=true
ます。
登録フォームで、パラメータが設定されているかどうかを確認してから、設定を記憶するための非表示フィールドを設定できます。
# Remember the medical user setting
<%= f.check_box :medical, checked: params[:medical].true?, hidden: true %>
check_boxタグがそのように機能するかどうかはわかりません。構文が異なる場合は、自由に編集してください。それが役に立てば幸い。
アプローチ2:DeviseRegistrationsControllerのオーバーライド
これは完全に可能です。ドキュメントを参照してください。ただし、Deviseコントローラーの内部が変更される可能性があり、これらの変更を手動で同期する必要があるため、これを行うと少し疲れを感じます。
アプローチ3:要求に応じて:さまざまなサインアップフォームを表示する
パラメータを使用して、ビューでレンダリングするフォームを決定できます(見栄えが悪く、スタイリッシュではありませんが、機能します:-D)。
<% if params[:medical] %>
<%= render 'medical_signup_form' %>
<% else %>
<%= render 'regular_signup_form' %>
<% end %>
その場合、両方のフォームに、関連するすべてのサインアップ属性を含める必要があります。これは確かにコードの重複ですが、私の意見では、気付かないうちに変更する必要があるかもしれないデバイスのコントローラーアクションをオーバーライドする必要はありません。