Rails/Devise - настроить флеш-сообщение (devise.en.yml) с помощью link_to
Я хотел бы настроить следующие флеш-сообщения, предоставленные приложением
в файле devise.en.yml:
devise:
failure:
unconfirmed: 'You have to confirm your account before continuing.'
с кодом ruby, чтобы получить ссылку на new_user_confirmation_path.
Другими словами, я хочу, чтобы в моем флэш-сообщении было что-то вроде:
'You have to confirm your account before continuing. Didn't receive confirmation instructions?'
где "Не получили подтверждения?" это ссылка на new_user_confirmation_path.
Я хотел бы знать, могу ли я сделать это без редактирования пользовательского контроллера, причина которого Devise не предоставляет его по умолчанию.
Спасибо за ваш ответ!
Ответы
Ответ 1
new_user_confirmation_path
является статическим эквивалентом url, равным /users/confirmation/new
Итак, вы можете просто сделать это в своем файле 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>"
В действиях контроллера, где вы показываете свою вспышку, убедитесь, что у вас есть .html_safe
, например. flash[:error].html_safe
Ответ 2
В одном из моих приложений я использую Devise и CanCan. Я спасаю от ошибок CanCan с чем-то вроде следующего в моем приложении.
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
Возможно, вы могли бы сделать что-то подобное и спасти от Devise? Тогда ваше флеш-сообщение может выглядеть примерно так:
flash[:error] = t("devise.failure.unconfirmed") + link_to "Didn't receive confirmation instructions?", new_user_confirmation_path
Еще лучше было бы поставить "Не получать..." в нем собственный перевод yml, если это необходимо.
Ответ 3
Если я понимаю, правильно поставил вопрос о бит кода t ('devise... вы должны поместить на наш взгляд, где вы хотите показать это сообщение.
Например 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 %>
Ответ 4
Вы также можете сделать это в своем конкретном макете: 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)
Ответ 5
Я думаю, что правильный путь для Rails 3 и Rails 4 для добавления необходимых ссылок и другой информации для создания флеш-сообщений - это написать свой собственный 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
И добавьте интерполяцию в переводы:
devise:
failure:
unconfirmed: You have to confirm your account before continuing.%{new_user_confirmation_link}
unconfirmed_link_text: Didn't receive confirmation instructions?
не забудьте добавить в config/initializers/devise.rb
:
config.warden do |manager|
manager.failure_app = CustomFailure
end