ruby-on-rails-3 - que - ruby on rails software
Rails 3: forma ideal de establecer el título de las páginas (13)
@akfalcon: utilizo una estrategia similar, pero sin el ayudante ... Simplemente configuro el @título predeterminado en el controlador de la aplicación y luego uso, <% = @ title%> en mi diseño. Si deseo anular el título, lo configuro nuevamente en la acción del controlador como lo hace. No hay magia involucrada, pero funciona muy bien. Hago lo mismo para la meta descripción y las palabras clave.
De hecho, estoy pensando en moverlo a la base de datos para que un administrador pueda cambiar los títulos, etc. sin tener que actualizar el código de Rails. Puede crear un modelo de Página de título con contenido, acción y controlador. Luego crea un helper que encuentre el PageTitle para el controlador / acción que estás renderizando actualmente (usando las variables controller_name y action_name). Si no se encuentra ninguna coincidencia, entonces devuelva el valor predeterminado.
@apeacox: ¿hay algún beneficio de establecer el título en la plantilla? Creo que sería mejor colocarlo en el controlador ya que el título se relaciona directamente con la acción que se llama.
¿Cuál es la forma correcta de establecer el título de la página en rieles 3. Actualmente estoy haciendo lo siguiente:
app / views / layouts / application.html:
<head>
<title><%= render_title %></title>
<%= csrf_meta_tag %>
app / helpers / application_helper.rb:
def render_title
return @title if defined?(@title)
"Generic Page Title"
end
app / controllers / some_controller.rb:
def show
@title = "some custom page title"
end
¿Hay otra / mejor manera de hacer lo anterior?
Descubrí que la solución de Apeacox no funcionó para mí (en Rails 3.0.3).
En cambio, lo hice ...
En application_helper.rb
:
def title(page_title, options={})
content_for(:title, page_title.to_s)
return content_tag(:h1, page_title, options)
end
En el diseño:
<title><%= content_for(:title) %></title>
En la vista:
<% title "Page Title Only" %>
O:
<%= title "Page Title and Heading Too" %>
Tenga en cuenta que esto también nos permite verificar la presencia de un título y establecer un título predeterminado en los casos en que la vista no haya especificado uno.
En el diseño podemos hacer algo como:
<title><%= content_for?(:title) ? content_for(:title) : ''This is a default title'' %></title>
En el diseño de la aplicación:
# app/views/layouts/application.html.erb
<title><%= (yield :title) || ''General title'' %></title>
luego, en cada vista donde quieras un título específico:
<% content_for :title, ''Specific title'' %>
Esta es mi forma preferida de hacerlo:
application_helper.rb
module ApplicationHelper
def title(*parts)
content_for(:title) { (parts << t(:site_name)).join('' - '') } unless parts.empty?
end
end
views / layouts / application.html.erb
<title>
<%= content_for?(:title) ? yield(:title) : t(:site_name) %>
</title>
config / locales / en.yml
en:
site_name: "My Website"
Esto tiene la buena ventaja de volver siempre al nombre del sitio en sus configuraciones regionales, que se puede traducir por idioma.
Luego, en cualquier otra página (por ejemplo, en la página Acerca de), puede simplemente poner:
views / home / about.html.erb
<% title ''About'' %>
El título resultante para esa página será:
Acerca de - Mi sitio web
Simples :)
Hay una manera simple de manipular las variables de diseño (título, descripción, etc.):
# app/views/application.html.erb
<title>
<%= content_for :title || ''App default title'' %>
</title>
# app/views/posts/index.html.erb
<%= content_for :title, ''List of posts'' %>
Y otras páginas tendrán App default title
para sus títulos
Mi respuesta es más simple:
locales / any_archive.yml :
pt-BR:
delivery_contents:
title: ''Conteúdos de Entregas''
groups:
title: ''Grupos''
Y dentro de application.html.slim :
title
= "App Name: #{t("#{controller_name.underscore}.title")}"
No es necesario crear ninguna función / ayuda adicional. Deberías echarle un vistazo a la documentación .
En el diseño de la aplicación
<% if content_for?(:title) %>
<%= content_for(:title) %>
<% else %>
<title>Default title</title>
<% end %>
En el diseño específico
<% content_for :title do %>
<title>Custom title</title>
<% end %>
Pensé que sería bueno:
<title>
<% if @title %>
<%= @title %>
<% else %>
Your title
<% end %>
</title>
Y dale un valor a @title en tu controlador, o el título será Your title
Prefiero esto:
module ApplicationHelper
def title(*page_title)
if Array(page_title).size.zero?
content_for?(:title) ? content_for(:title) : t(:site_name)
else
content_for :title, (Array(page_title) << t(:site_name)).join('' - '')
end
end
end
Si se llama title
sin argumentos, devuelve el valor actual del título o el valor predeterminado que en este ejemplo será "Ejemplo".
Su title
se llama con argumentos, lo establece en el valor pasado.
# layouts/application.html.erb
<title><%= title %></title>
# views/index.html.erb
<% title("Home") %>
# config/locales/en.yml
en:
site_name: "Example"
También puedes consultar esta railscast . Creo que será muy útil y te dará un comienzo básico.
NOTA: en caso de que quiera páginas más dinámicas con pjax
Tengo una solución algo más complicada. Quiero administrar todos mis títulos en mis archivos de configuración regional. También quiero incluir títulos significativos para mostrar y editar páginas de modo que el nombre del recurso esté incluido en el título de la página. Finalmente, quiero incluir el nombre de la aplicación en cada título de página, por ejemplo, Editing user Gustav - MyApp
.
Para lograr esto creo un ayudante en application_helper.rb
que hace la mayor parte del trabajo pesado. Esto intenta obtener un nombre para la acción determinada del archivo de configuración regional, un nombre para el recurso asignado si hay uno y los combina con el nombre de la aplicación.
# Attempt to build the best possible page title.
# If there is an action specific key, use that (e.g. users.index).
# If there is a name for the object, use that (in show and edit views).
# Worst case, just use the app name
def page_title
app_name = t :app_name
action = t("titles.#{controller_name}.#{action_name}", default: '''')
action += " #{object_name}" if object_name.present?
action += " - " if action.present?
"#{action} #{app_name}"
end
# attempt to get a usable name from the assigned resource
# will only work on pages with singular resources (show, edit etc)
def object_name
assigns[controller_name.singularize].name rescue nil
end
Tendrá que agregar textos específicos de acción en sus archivos de configuración regional de la siguiente forma:
# en.yml
titles:
users:
index: ''Users''
edit: ''Editing''
Y si desea utilizar nombres de recursos significativos en sus vistas singulares, puede que necesite agregar un par de métodos proxy, por ejemplo
# User.rb
def name
username
end
Ya hay algunas buenas respuestas, pero agregaré mi enfoque simple. Agregue esto a layouts / application.html
- if content_for?(:title)
-title = "My site | #{content_for(:title)}"
-else
-title = "My site | #{controller_name.titleize}"
Automáticamente obtiene un buen nombre en todas sus vistas como "Mi sitio | Publicaciones" - o lo que sea que el controlador sea.
Por supuesto, puede establecer opcionalmente un título en una vista agregando:
- content_for(:title, ''About'')
y obtener un título como "Mi sitio | Acerca de".
podrías un simple ayudante:
def title(page_title)
content_for :title, page_title.to_s
end
Úselo en su diseño:
<title><%= yield(:title) %></title>
luego llámalo desde tus plantillas:
<% title "Your custom title" %>
espero que esto ayude ;)