2010-10-24 12 views
15

vorrei personalizzare il seguente msg Flash fornito da devise nel file devise.en.yml:Rails/Devise - Personalizza messaggio flash (devise.en.yml) con un link_to

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

con codice rubino per ottenere un collegamento a new_user_confirmation_path.

in altre parole, voglio che il mio messaggio flash mostra qualcosa come: '? Non ha ricevuto istruzioni di conferma'

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

dove è un collegamento a new_user_confirmation_path.

Mi piacerebbe sapere se posso farlo senza modificare il controller utente perché Devise non lo fornisce di default.

Grazie per la risposta!

risposta

18

new_user_confirmation_path è un URL statica equivalente a /users/confirmation/new

Così si può solo fare questo nel file 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>" 

Nelle azioni di controllo dove si visualizzano il flash assicurarsi di avere .html_safe es flash[:error].html_safe

1

Se sto capito messo domanda giusta la porzione di codice t ('inventare ... si deve porre al nostro punto di vista, in cui si desidera visualizzare questo messaggio

Per esempio 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

Ciao potapuff, io riscrivere la questione al fine di renderlo più chiaro. Grazie! – benoitr

3

in una delle mie applicazioni che sto usando Devise e CanCan. ho salvataggio da errori di Cancan con qualcosa di simile a quanto segue nella mia applicazione 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 

Forse potrebbe fare qualcosa di simile e salvare da Devise? Il tuo messaggio flash potrebbe quindi essere qualcosa di simile:

flash[:error] = t("devise.failure.unconfirmed") + link_to "Didn't receive confirmation instructions?", new_user_confirmation_path 

Ancora meglio sarebbe di mettere il "non ha ricevuto ..." in un suo yml traduzione se necessario.

0

Si può anche farlo nella vostra disposizione testamentaria layout specifico: 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) 
0

penso che il modo giusto per Rails 3 & Rails 4 per aggiungere i collegamenti necessari e altre informazioni di elaborare messaggi flash è quello di scrivere il vostro proprio 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 aggiungere interpolazione per traduzioni:

devise: 
    failure: 
    unconfirmed: You have to confirm your account before continuing.%{new_user_confirmation_link} 
    unconfirmed_link_text: Didn't receive confirmation instructions? 

non dimenticare di aggiungere alla config/initializers/devise.rb:

config.warden do |manager| 
    manager.failure_app = CustomFailure 
end 
Problemi correlati