Rails/Devise - Personalize Flash Message (devise.en.yml) com um link_to
-
25-09-2019 - |
Pergunta
Gostaria de personalizar o seguinte msg flash fornecido pela Devise no arquivo devise.en.yml:
devise:
failure:
unconfirmed: 'You have to confirm your account before continuing.'
com o código Ruby para obter um link para new_user_confirmation_path.
Em outras palavras, quero que minha mensagem flash exibe algo como:
'You have to confirm your account before continuing. Didn't receive confirmation instructions?'
onde 'não recebeu instruções de confirmação?' é um link para new_user_confirmation_path.
Gostaria de saber se posso fazer isso sem editar o controlador de usuário A causa O Devise não o fornece por padrão.
Obrigado pela sua resposta!
Solução
new_user_confirmation_path
é um URL estático equivalente a /users/confirmation/new
Então você pode fazer isso no seu arquivo devise.en.yml:
devise:
failure:
unconfirmed: "You have to confirm your account before continuing. <a href='/users/confirmation/new'>Didn't receive confirmation instructions?</a>"
Nas ações do controlador em que você exibe seu flash, certifique -se de ter .html_safe
por exemplo flash[:error].html_safe
Outras dicas
Em um dos meus aplicativos, estou usando o Devise e o CANCAN. Eu resgato dos erros de Cancan com algo como o seguinte no meu aplicativo Conroller.
rescue_from CanCan::AccessDenied do |exception|
if current_user
flash[:error] = exception.message
redirect_to root_url
else
flash[:error] = t("devise.failure.unauthenticated")
redirect_to new_user_session_path
end
end
Talvez você possa fazer algo semelhante e resgatar com o Devise? Sua mensagem flash pode ser algo como:
flash[:error] = t("devise.failure.unconfirmed") + link_to "Didn't receive confirmation instructions?", new_user_confirmation_path
Melhor ainda seria colocar o "não recebia ..." em sua própria tradução YML, se necessário.
Eu acho que a maneira certa para os Rails 3 & Rails 4 adicionar links necessários e outras informações para criar mensagens flash é escrever seu próprio Devise::FailureApp
:
# lib/custom_failure.rb
class CustomFailure < Devise::FailureApp
def i18n_options(options)
path = Rails.application.routes.url_helpers.new_user_confirmation_path
link = ActionController::Base.helpers.link_to(I18n.t('.unconfirmed_link_text', options), path)
super(options).merge(new_user_confirmation_link: link)
end
end
E adicione a interpolação às traduções:
devise:
failure:
unconfirmed: You have to confirm your account before continuing.%{new_user_confirmation_link}
unconfirmed_link_text: Didn't receive confirmation instructions?
Não se esqueça de adicionar config/initializers/devise.rb
:
config.warden do |manager|
manager.failure_app = CustomFailure
end
Se eu entender, faça uma pergunta certa o bit do código t ('Devise ... você deve colocar em nossa opinião, onde deseja mostrar esta mensagem.
Por exemplo devise/new.erb
:
<%= t('devise.failure.unconfirmed',
:confirm_link => link_to(
t('devise.failure.confirm_link_text'),
new_user_confirmation_path).html_safe
) unless user.confirmed %>
Você também pode fazê -lo no seu layout específico: app/views/layouts/devise.html.slim
- flash.each do |type, message|
- if ['alert', 'error', 'notice'].include?(type.to_s)
.alert-box class=type
=> message
- case message
- when t('devise.failure.unauthenticated')
= link_to "Forgot your password?", new_password_path(resource_name)
- when t('devise.failure.unconfirmed')
= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name)
- when t('devise.failure.locked')
- if resource_class.unlock_strategy_enabled?(:email)
= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name)