フラッシュメッセージをカスタマイズ


問題:私は“ウェルカム、あなたが首尾よくサインアップしている”フラッシュメッセージは、ユーザーがサインアップするときに表示されます.もっと個人的なものが欲しい.暖かい歓迎したい.簡単!点滅して、それは行われます!まあ、そんなに速く、実際に.

何が私はパーソナライズされたメッセージを表示する必要がありますか?


サインアップのこの退屈なプロセスに少しの暖かさを加えるために、私は彼女/ユーザ名によって新しいユーザーに対処したいです.まず最初にユーザ名属性を追加することでユーザモデルを変更する必要があります.
$ rails generate migration AddUsernameToUsers username:string

それからDB DBスキーマの変更を保存します.
$ rails db:migrate

今、私はユーザに良いユーザ名を設定する可能性を与えなければなりません.私の見る限りでは、Develseのデフォルトビューにはサインアップのための2つの必須フィールドがあります.ので、登録のビューにアクセスする必要があります.

ディスコース登録はどこですか?


私のアプリケーションフォルダーでは、deviseビューはどこにも見つかりません.明らかに、彼らは隠されていますが、それらを見る方法がなければなりません!ここに、GEM 1の著者によって書かれた大きなドキュメンテーションがあります.考案は、専用のフォルダ内の認証に関連付けられているすべてのビューをコピーする簡単なジェネレータを提供します.
$ rails generate devise:views

現在、私はdeviseフォルダを持っています、そして、中で、私は新しいもので登録フォルダを見つけることができます.HTML .私が予想したerbファイル.フォームにユーザー名フィールドを追加するだけです.
 <div class="form-inputs">
        <%= f.input :username,
                    required: true,
                    autofocus: true,
                    input_html: { autocomplete: "username" }%>
        <%= f.input :email,
                    required: true,
                    autofocus: true,
                    input_html: { autocomplete: "email" }%>
        <%= f.input :password,
                    required: true,
                    hint: ("#{@minimum_password_length} characters minimum" if @minimum_password_length),
                    input_html: { autocomplete: "new-password" } %>
        <%= f.input :password_confirmation,
                    required: true,
                    input_html: { autocomplete: "new-password" } %>
      </div>

登録アクションの管理者はどこですか?


ユーザーが正しいメール、パスワードとユーザー名を提供するとき、新しいユーザーは登録されます.フードの下で、登録コントローラはヒットします、そして、特に登録のためにロジックを保持するその作成メソッド.プロセスが成功した場合、コントローラは関連するビューにウェルカムメッセージを表示するよう依頼します.このコントローラーにアクセスして、作成方法を変更する必要があります.しかし、デフォルトでは、deviseコントローラも同様に隠されます.問題なく、カスタマイズ可能なコントローラを作成する簡単なジェネレータもあります.
$ rails generate devise:controllers users

私は、ユーザーをスコープとして使用します.認証に関連付けられているコントローラは、私のアプリケーションのコントローラフォルダ内のユーザーフォルダになります.

どのように、私は登録コントローラを修正しますか?


現在、私は私の登録コントローラを見ることができます、しかし、私が想像した方法ででなく.
  # POST /resource
  # def create
  # super
  # end

私は' super 'キーワード2親/子クラスとは何かを持っている知っている.私はそれを保つことができて、新しい振舞いを加えることができました、しかし、私が修正して、加えないように、私は単にカスタムコードでそれを取り替えます.さて、私はそれのすべてをカスタマイズしたくないので、私は元のコードを保って、私が必要とするものを修正するのを好みます.Registrationsコントローラコード3のDevelseのソースを簡単に見てください.
# POST /resource

def create
  build_resource(sign_up_params)
  resource.save

  yield resource if block_given?
  if resource.persisted?
    if resource.active_for_authentication?
    set_flash_message! :notice, :signed_up
    sign_up(resource_name, resource)
    respond_with resource, location: after_sign_up_path_for(resource)
    else
    set_flash_message! :notice, :"signed_up_but_#{resource.inactive_message}"
    expire_data_after_sign_in!
    respond_with resource, location: after_inactive_sign_up_path_for(resource)
    end
  else
  clean_up_passwords resource
  set_minimum_password_length
  respond_with resource
  end
end

私はここに2つの可能性を持って、私は将来的に私のアプリを国際化する場合に依存します.そうでなければ、私は単に
set_flash_message! :notice, :signed_up

そば
flash[:notice] = "Hello there, #{resource.username}! Glad to welcome you here!"

しかし、私はすぐにI 18 N宝石を使用したいので、私はSetHorseフラッシュメッセージメソッドにユーザー名変数を渡すことを好むし、deviseを変更します.enフラッシュメッセージのすべての英訳を保持するYMLファイル.
set_flash_message! :notice, :signed_up, :username => resource.username

どのように、私はフラッシュメッセージをカスタマイズしますか?


SetHorseフラッシュメッセージメソッドがユーザー名変数にアクセスできるようになったので、私は工夫を開く必要があります.enymlファイルを登録します.
en:
  devise:
    registrations:
      sign_up: "Hello there, %{username}! Glad to welcome you here!"

デバッグ.


すべてが良いように、私はサーバーを再起動し、今私は良い歓迎メッセージを受信する準備が整いました.迅速なテストとまあ、どのように失望!私は新しいフラッシュメッセージを持っていますが、私は私のユーザ名が表示されません.何が間違っている私は尋ねる?それは超高速であることになっていました、そして、私はすでに全部を理解しているあまりに多くの時間を費やしました.Railsコンソールをチェックすると、最後の登録ユーザーはNILに設定されたユーザ名を持っていることがわかります.しかし、私は美しいものに入りました、しかし、工夫は私のdBでそれを保存することを拒否しました.私が推測するセキュリティ問題でなければなりません.リストにユーザー名パラメータを追加する場所を見つける必要があります.

強いパラメータを考案する


もう一度ドキュメントを考案する私の友人です.ソースコードを変更する必要はありませんが、アプリケーションコントローラで許可されているパラメータを2段階で設定する必要があります.
アクションの追加
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?

  • ConfigureHeight permittedHeightパラメーターメソッドを追加する
  • protected
    
    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
    end
    
    

    そして今、魔法が起こります。)



  • deviseのすべての参照は、彼らの大きなドキュメンテーションです.たとえば、ビューを構成するには、を参照してください

  • Rubyの' super 'キーワードについての簡単な概要については

  • Devseのソースコードはオープンソースであり、HeartコンボGithubリポジトリで利用可能です.たとえば、登録コントローラのソースコードはこちら