2

私はDeviseを使用してアプリケーションを作成しています。このアプリケーションでは、平均的なジョー市民が質問をすることができます。質問には、ある種の医療専門家が回答することを願っています。私のホームページには、このような2つのサインアップリンクが必要です。

<li><%= link_to "Sign up", new_user_registration_path %></li>
<li><%= link_to "Are you a Medical Professional?", new_user_registration_path %></li>

しかし、私は彼らに明らかに異なるサインアップフォームを表示させたいので、私が想定する異なるルートが必要になります。

Userモデルの唯一の違いは、Medical Professionalの場合、Medical Professionalのブール属性は「true」であるのに対し、平均的なJoeの場合はfalseであるということです。

これを行う簡単な方法はありますか?

4

1 に答える 1

2

アプローチ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 %>

その場合、両方のフォームに、関連するすべてのサインアップ属性を含める必要があります。これは確かにコードの重複ですが、私の意見では、気付かないうちに変更する必要があるかもしれないデバイスのコントローラーアクションをオーバーライドする必要はありません。

于 2013-03-25T20:40:27.257 に答える