Devise의 flash 메시지 사용자 정의
개성화된 메시지를 표시하려면 무엇이 필요합니까?
이 무료한 등록 과정에 따뜻함을 더하기 위해서 나는 그녀의 사용자 이름으로 새 사용자를 부르고 싶다.따라서 우선 사용자 이름 속성을 추가해서 사용자 모델을 수정해야 합니다.
$ 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?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
end
이제 기적이 일어났다.
Reference
이 문제에 관하여(Devise의 flash 메시지 사용자 정의), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/cecilerx/customize-devise-s-flash-messages-2oi6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)