2011-05-15 14 views
8

Me gustaría acceder a current_user.username en mi mensaje flash después de registrarme. ¿Cómo voy a hacer esto? ¿Se puede hacer esto en el archivo devise.en.yml?idear mensaje flash personalizado

Respuesta

19

Creo que debe sobrescribir el controlador de registro para personalizar su mensaje flash.

Si echa un vistazo al archivo devise.en.yml, puede ver que se usan algunas variables como %{resource} o %{count}. Al echar un vistazo al controlador de registro original, se puede ver el código (check here)

# POST /resource 
def create 
build_resource(sign_up_params) 

if resource.save 
    yield resource if block_given? 
    if resource.active_for_authentication? 
    set_flash_message :notice, :signed_up if is_flashing_format? 
    sign_up(resource_name, resource) 
    respond_with resource, location: after_sign_up_path_for(resource) 
    else 
    set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format? 
    expire_data_after_sign_in! 
    respond_with resource, location: after_inactive_sign_up_path_for(resource) 
    end 
else 
    clean_up_passwords resource 
    respond_with resource 
end 

final

Me gustaría volver a escribir este controlador y añadir esta línea

set_flash_message :notice, :signed_up, :username => resource.username if is_flashing_format? 

A continuación, en el archivo de devise.en.yml , deberías poder usar algo así

devise: 
    registrations: 
    signed_up: 'oh hello %{username}' 

Dime si eso funcionó.

Si necesita pista sobre cómo reescribir controlador que concebir y echar un vistazo a this

espero que ayudó.

===== ===== ACTUALIZACIÓN

lo probé y funcionó.

Bueno por lo que si queremos ir más profundo, podemos comprobar lib/devise/controllers/internal_helpers.rb:

# Sets the flash message with :key, using I18n. By default you are able 
# to setup your messages using specific resource scope, and if no one is 
# found we look to default scope. 
# Example (i18n locale file): 
# 
# en: 
# devise: 
# passwords: 
# #default_scope_messages - only if resource_scope is not found 
# user: 
# #resource_scope_messages 
# 
# Please refer to README or en.yml locale file to check what messages are 
# available. 
def set_flash_message(key, kind, options={}) #:nodoc: 
    options[:scope] = "devise.#{controller_name}" 
    options[:default] = Array(options[:default]).unshift(kind.to_sym) 
    options[:resource_name] = resource_name 
    message = I18n.t("#{resource_name}.#{kind}", options) 
    flash[key] = message if message.present? 
end 

Pero por favor, actualice su código para que podamos ver lo que está mal.

+0

Funcioné carriles g Controlador Registros y copiado y pegado en el código de diseño original. Luego modifiqué la línea apropiada como sugirió y el archivo devise.en.yml también. Obtengo este error: falta el argumento de interpolación en "Registrarse completo,% {nombre de usuario}" ({: nombre_de_depósito =>: usuario} dado) – chief

+0

Actualicé mi publicación. Intenté mi consejo y funcionó para mí. – Lucas

+1

Mmm, volviendo a leer su comentario, tengo la sensación de que olvidó decirle a Rails que use su nuevo controlador para registros. Por favor, siga eso: en config/routes.rb agregue: controllers => {: registrations => "registrations"} a su devise_for root. (ver de nuevo ese [tutorial] (https://github.com/plataformatec/devise/wiki/How-To%3a-Allow-users-to-edit-their-account-without-providing-a-contraseña)) – Lucas

Cuestiones relacionadas