Rails / Devise - настройка флеш-сообщения (devise.en.yml) с помощью link_to - PullRequest
15 голосов
/ 24 октября 2010

Я хотел бы настроить следующую флэш-сообщение, предоставляемое devise в файле devise.en.yml:

devise:
   failure:
      unconfirmed: 'You have to confirm your account before continuing.'

с рубиновым кодом, чтобы получить ссылку на new_user_confirmation_path.

другими словами, я хочу, чтобы мое флеш-сообщение отображало что-то вроде:

'You have to confirm your account before continuing. Didn't receive confirmation instructions?'

, где «Не получили инструкции подтверждения?»является ссылкой на new_user_confirmation_path.

Я хотел бы знать, могу ли я сделать это без редактирования пользовательского контроллера, поскольку Devise не предоставляет его по умолчанию.

Спасибо за ваш ответ!

Ответы [ 5 ]

18 голосов
/ 03 апреля 2011

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

3 голосов
/ 11 ноября 2010

В одном из моих приложений я использую 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, если это необходимо.

2 голосов
/ 17 июня 2016

Я думаю, что правильный путь для Rails 3 и Rails 4 для добавления необходимых ссылок и другой информации в флеш-сообщения Devise - это написать свои 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
1 голос
/ 09 ноября 2010

Если я понимаю, поставьте вопрос правильно, бит кода 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 %>
0 голосов
/ 03 декабря 2014

Вы также можете сделать это в вашей конкретной схеме: 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...