ruby on rails - translations - Rails/Devise-Personaliza el mensaje de destello(devise.en.yml) con un link_to
rails i18n models (5)
Si me entiendes, haz una pregunta correcta, la parte del código t (''idear ... debes ubicarla en nuestra vista, donde deseas mostrar este mensaje.
Por ejemplo, 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 %>
Me gustaría personalizar el siguiente msj flash provisto por el dispositivo en el archivo devise.en.yml:
devise:
failure:
unconfirmed: ''You have to confirm your account before continuing.''
con código ruby para obtener un enlace a new_user_confirmation_path.
en otras palabras, quiero que mi mensaje flash muestre algo así como:
''You have to confirm your account before continuing. Didn''t receive confirmation instructions?''
donde ''¿No recibió las instrucciones de confirmación?'' es un enlace a new_user_confirmation_path.
Me gustaría saber si puedo hacer esto sin editar el controlador de usuario, ya que Devise no lo proporciona de forma predeterminada.
¡Gracias por tu respuesta!
En una de mis aplicaciones, estoy usando Devise y CanCan. Rescato los errores de CanCan con algo como lo siguiente en mi aplicador de aplicaciones.
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
¿Quizás podrías hacer algo similar y rescatar a Devise? Su mensaje flash podría ser algo así como:
flash[:error] = t("devise.failure.unconfirmed") + link_to "Didn''t receive confirmation instructions?", new_user_confirmation_path
Aún mejor sería poner "No recibí ..." en su propia traducción yml si es necesario.
new_user_confirmation_path
es una URL estática equivalente a /users/confirmation/new
Así que puedes hacer esto en tu archivo 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>"
En las acciones del controlador donde muestra su flash, asegúrese de tener .html_safe
por ejemplo, flash[:error].html_safe
También puede hacerlo en su diseño 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)
Creo que la forma correcta de que Rails 3 & Rails 4 agregue enlaces requeridos y otra información para idear mensajes flash es escribir su propia 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
Y agrega interpolación a las traducciones:
devise:
failure:
unconfirmed: You have to confirm your account before continuing.%{new_user_confirmation_link}
unconfirmed_link_text: Didn''t receive confirmation instructions?
no olvides agregar a config/initializers/devise.rb
:
config.warden do |manager|
manager.failure_app = CustomFailure
end