Devise의 flash 메시지 사용자 정의

질문: 저는 Desive가 사용자가 등록할 때 표시하는 "Welcome, you have signed successfully"(환영합니다. 성공적으로 등록했습니다) 플래시 메시지를 좋아하지 않습니다.나는 더욱 개성화된 것을 원한다. 나는 열렬한 환영을 원한다.쉬웠어눈 깜짝할 사이에 일이 완성될 거야!사실 그렇게 빠르지 않아요.

개성화된 메시지를 표시하려면 무엇이 필요합니까?


이 무료한 등록 과정에 따뜻함을 더하기 위해서 나는 그녀의 사용자 이름으로 새 사용자를 부르고 싶다.따라서 우선 사용자 이름 속성을 추가해서 사용자 모델을 수정해야 합니다.
$ rails generate migration AddUsernameToUsers username:string

그런 다음 데이터베이스 모드의 변경 사항을 저장합니다.
$ rails db:migrate

지금 나는 반드시 나의 사용자에게 좋은 사용자 이름을 설정해야 한다.이 장치의 기본 보기는 전자 메일과 비밀번호 등 두 개의 등록 필수 필드만 있는 것으로 알고 있습니다.네, 등록 보기에 접근해서 수정해야 합니다.

디자인 등록 보기는 어디에 있습니까?


내 응용 프로그램 폴더에서 디자인 보기를 찾을 수 없습니다.분명히 그것들은 숨겨져 있지만, 반드시 그것들을 볼 방법이 있을 거야!다음은gem1 작가가 쓴 위대한 문서입니다.Deviate는 인증과 관련된 모든 보기를 전용 폴더로 복사하는 간단한 생성기를 제공합니다.
$ rails generate devise:views

지금 나는 디자인 폴더가 하나 있는데, 그 안에서 나는 새로운 등록 폴더를 찾을 수 있다.html.내가 원하는 eb 파일입니다.양식에 사용자 이름 필드만 추가하면 됩니다.
 <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>

통제원은 어디에서 등록을 책임집니까?


사용자가 정확한 전자메일, 비밀번호, 사용자 이름을 제공할 때 새 사용자가 등록됩니다.엔진 뚜껑 아래에서 등록 컨트롤러가 눌렸고, 특히 등록 논리를 저장하는 생성 방법이 눌렸다.이 과정이 성공하면 컨트롤러는 관련 보기에 환영 메시지를 표시해야 합니다.이 컨트롤러에 접근해서create 방법을 원하는 방식대로 수정해야 합니다.하지만 Desive 컨트롤러는 기본적으로 숨겨져 있습니다.문제 없습니다. 사용자 정의 컨트롤러를 만들 수 있는 간단한 생성기도 있습니다.
$ rails generate devise:controllers users

장치 컨트롤러와 다른 컨트롤러를 분리하기 위해 사용자를 범위로 지정합니다.인증과 관련된 컨트롤러는 내 응용 프로그램의 컨트롤러 폴더에 있는 사용자 폴더에 있습니다.

등록 컨트롤러는 어떻게 수정합니까?


지금 나는 나의 등록 컨트롤러를 볼 수 있지만, 내가 상상하는 방식은 아니다.
  # POST /resource
  # def create
  # super
  # end

나는'슈퍼'키워드2가 부/자류와 관련이 있다는 것을 안다.나는 그것을 보류하고 새로운 행동을 추가할 수 있지만, 추가하는 것이 아니라 수정하고 싶기 때문에, 나는 간단하게 사용자 정의 코드로 그것을 대체할 것이다.응, 나는 모든 맞춤형 제작을 원하지 않기 때문에 차라리 원시 코드를 보존하고 내가 필요로 하는 내용을 수정하고 싶다.다음과 같이 장치의 등록 컨트롤러 코드3의 소스를 빠르게 확인합니다.
# 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

여기에 두 가지 가능성이 있습니다. 이것은 제가 미래에 응용 프로그램을 국제화할 계획인지에 달려 있습니다.만약 없다면, 나는 간단하게 바꿀 수 있다
set_flash_message! :notice, :signed_up

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

하지만 저는 I18ngem을 빨리 사용하고 싶습니다. 그래서 사용자 이름 변수를 set\uflash\u 메시지 방법에 전달하고 디자인을 수정하는 것을 더 좋아합니다.네.flash 메시지를 포함하는 모든 영문 번역된 yml 파일입니다.
set_flash_message! :notice, :signed_up, :username => resource.username

어떻게 플래시 메시지를 사용자 정의합니까?


set\uflash\u 메시지 방법은username 변수에 접근할 수 있으므로 이 장치를 열기만 하면 됩니다.네.yml 파일, 등록 정보 찾기 및 수정:
en:
  devise:
    registrations:
      sign_up: "Hello there, %{username}! Glad to welcome you here!"

디버깅 중...


모든 것이 좋은 것 같아서, 나는 서버를 다시 시작했고, 지금 나는 나의 환영 소식을 받을 준비가 되어 있다.빠른 테스트, 그래, 얼마나 실망스러운가!새로운 플래시 메시지가 있습니다. 그렇습니다. 하지만 사용자 이름이 나오는 것을 보지 못했습니다.뭐가 잘못됐냐고요?그것은 매우 빠를 것이다. 나는 이미 모든 것을 이해하는 데 너무 많은 시간을 들였다.rails 컨트롤러를 검사해 보니 마지막으로 등록된 사용자의 사용자 이름이 NIL로 설정되어 있습니다.비록 나는 아름다운 것에 들어갔지만, 디자인은 나의 데이터베이스에 저장하는 것을 거절했다.나는 이것이 틀림없이 안전 문제라고 생각한다. 물론 디자인 방법은 매우 강한 매개 변수가 있다.목록에 사용자 이름 매개 변수를 추가할 위치만 찾으면 됩니다.

강력한 매개변수 설계


문서를 다시 설계하는 것은 나의 친구다.디자인 원본 코드를 수정할 필요가 없다는 것을 알았지만, 응용 프로그램 컨트롤러에 허용된 파라미터를 두 단계로 나누어 설정해야 합니다.
  • 작업 전에 추가
  • class ApplicationController < ActionController::Base
    before_action :configure_permitted_parameters, if: :devise_controller?
    
    
  • configure\u allowed\u parameters 추가 방법
  • protected
    
    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
    end
    
    

    이제 기적이 일어났다.



  • Deave의 모든 참고 자료는 그들의 우수한 문서에서 나온 것입니다.예를 들어, 뷰를 구성하려면: https://github.com/heartcombo/devise#configuring-views

  • 루비의 "super"키워드에 대한 빠른 개요는 https://medium.com/rubycademy/the-super-keyword-a75b67f46f05

  • Devise의 원본 코드는 하트콤보github 저장소에서 얻을 수 있는 원본 코드입니다.예를 들어, 등록 컨트롤러의 소스 코드는 다음과 같습니다. https://github.com/heartcombo/devise/blob/master/app/controllers/devise/registrations_controller.rb

    좋은 웹페이지 즐겨찾기