ruby-on-rails - multi - rails i18n models
En Rails, cómo especificar mensajes flash predeterminados en el archivo de configuración regional i18n (3)
Creo que actualmente ( otoño 2015 ) la forma más elegante y convencional de implementar mensajes perezosos para sus controladores es usar la gema de los responders
:
gem ''responders'', ''~> 2.1''
FlashResponder
establece el flash según la acción del controlador y el estado de los recursos. Por ejemplo, si lo hace:respond_with(@post)
en una solicitud POST y el recurso@post
no contiene errores, configurará automáticamente el mensaje flash en"Post was successfully created"
siempre que configure su archivo I18n:
flash:
actions:
create:
notice: "%{resource_name} was successfully created."
update:
notice: "%{resource_name} was successfully updated."
destroy:
notice: "%{resource_name} was successfully destroyed."
alert: "%{resource_name} could not be destroyed."
Esto permite eliminar completamente el código relacionado con flash
de los controladores.
Sin embargo, como ya ha entendido, deberá volver a escribir sus controladores con su método respond_with
para eso:
# app/controllers/users_controller.rb
class UsersController < ApplicationController
respond_to :html, :json
def show
@user = User.find params[:id]
respond_with @user
end
end
Sé que hay algunas estructuras preestablecidas en el archivo de configuración regional i18n, por lo que Rails obtiene los valores automáticamente. Por ejemplo, si desea configurar el texto del botón de envío predeterminado para nuevos registros:
# /config/locales/en.yml
en:
helpers:
submit:
create: "Create %{model}"
user:
create: "Sign Up"
Con este conjunto, en las vistas resultará lo siguiente:
# /app/views/things/new.html.erb
<%= f.submit %> #=> Renders a submit button reading "Create Thing"
# /app/views/users/new.html.erb
<%= f.submit %> #=> Renders a submit button reading "Sign Up"
Así que Rails usa una jerarquía preestablecida para obtener el texto del botón de envío para diferentes modelos. (es decir, no tiene que decirle qué texto i18n obtener al usar f.submit
). He estado tratando de encontrar una manera de hacerlo con avisos y alertas flash. ¿Hay una estructura preestablecida similar para especificar mensajes flash predeterminados?
Sé que puedes especificar tus propias estructuras arbitrarias como las siguientes:
# /config/locales/en.yml
en:
controllers:
user_accounts:
create:
flash:
notice: "User account was successfully created."
# /app/controllers/users_controller.rb
def create
...
redirect_to root_url, notice: t(''controllers.user_accounts.create.flash.notice'')
...
end
Pero es tedioso especificar el notice: t(''controllers.user_accounts.create.flash.notice'')
cada vez. ¿Hay alguna forma de hacer esto para que el controlador "simplemente sepa" cuándo agarrar y mostrar los mensajes flash apropiados especificados en el archivo de configuración regional? Si es así, ¿cuál es la estructura YAML predeterminada para estos?
La sección 4.1.4 de la guía Rails i18n sobre búsquedas "perezosas" dice:
Rails implementa una forma conveniente de buscar la ubicación dentro de las vistas
(Enfatice las suyas, e insinuándome, al menos, que está restringido solo a vistas ...) Sin embargo, parece que este compromiso con Rails trajo búsquedas "perezosas" en los controladores también, con la clave en la forma :
"#{ controller_path.gsub(''/'', ''.'') }.#{ action_name }#{ key }"
que en tu caso debería conseguirte users.create.notice
.
Entonces, si estás contento con algo como:
# /app/controllers/users_controller.rb
def create
...
redirect_to root_url, notice: t(''.notice'')
...
end
Debería poder declarar ese valor en:
# /config/locales/en.yml
en:
users:
create:
notice: "User account was successfully created."
Sé que esto no te lleva a tener un lugar por defecto donde Rails iría automáticamente a buscar un aviso instantáneo por no crear un usuario, pero es un poco mejor que escribir una tecla i18n completa cada vez.
Para realizar un seguimiento del comentario de @ robertwbradford sobre las pruebas, en una prueba funcional (controlador) de Rails 4 / MiniTest, puede llamar al método de traducción en la variable de instancia del controlador @:
assert_equal @controller.t(''.notice''), flash[:notice]