Tengo un escenario en el que me gustaría tener el nombre de la vista que se renderizará mientras estoy en el archivo de diseño. Puedo encontrar soluciones para encontrar qué diseño envolverá la vista actual desde la vista, pero no al revés. ¿Cómo puedo encontrar qué vista está renderizando?Rails 3, encuentra la vista actual en el diseño
Respuesta
En Rails 3.0.3, yo era capaz de ver el nombre de el controlador y la acción utilizando controller_name y action_name. Pero esos no están documentados públicamente (al menos el nombre de la acción) por lo que no dependería de ello a largo plazo.
Podría ser mejor que renderizar la plantilla de parche mono. En un inicializador:
module ActionView::Rendering
alias_method :_render_template_original, :_render_template
def _render_template(template, layout = nil, options = {})
@last_template = template
_render_template_original(template, layout, options)
end
end
Luego use @last_template en su diseño.
Me gusta el siguiente enfoque, ya que puede reducir un poco el tamaño del código en muchos casos. Incluir esto en su application_controller.rb:
before_filter :instantiate_controller_and_action_names
caches_action :instantiate_controller_and_action_names
def instantiate_controller_and_action_names
@current_action = action_name
@current_controller = controller_name
end
Entonces, si sus puntos de vista corresponden a una acción, que acaba de hacer:
dosomething if @current_action == 'new'
Esto no acaba de resolver el problema que tengo. Necesito el nombre de la vista, y no siempre es lo mismo que la acción que se llama. –
Simplemente agregue una acción en blanco, por ejemplo, defina el final. – jschorr
La siguiente solución funciona en Rails 3.1. Coloque este código en un inicializador. (La respuesta de los carriles 3.0.3 ya no funciona en Rails 3.1)
Esto habilita una variable @active_template para cada controlador. Esta es una instancia de una clase ActionViewTemplate.
El método active_template_virtual_path método devuelve la plantilla como el nombre de la siguiente forma "controlador/acción"
class ActionController::Base
attr_accessor :active_template
def active_template_virtual_path
self.active_template.virtual_path if self.active_template
end
end
class ActionView::TemplateRenderer
alias_method :_render_template_original, :render_template
def render_template(template, layout_name = nil, locals = {})
@view.controller.active_template = template if @view.controller
result = _render_template_original(template, layout_name, locals)
@view.controller.active_template = nil if @view.controller
return result
end
end
Esto funciona para mí con Rails 3.1.3. Aunque acorté un poco la solución: '@ view.assign (: active_template => template)' dentro de 'render_template', entonces puedes eliminar un montón del código adicional y acceder a la plantilla dentro de una vista como' @ active_template'. – David
Descubrí que esto daba problemas a la joya 'exception_notification'. Para arreglar esto hice [estos cambios] (http://pastebin.com/raw.php?i=sd8f01mp). –
Tuve un problema con los diseños anidados (http://guides.rubyonrails.org/layouts_and_rendering.html#using-nested-layouts). El active_template se estableció en mi diseño más alto en lugar de la vista desde el controlador. Para corregir, agregué una condición adicional en el archivo de assignment: '@view.controller.active_template = template if @ view.controller && @ view.controller.active_template.nil? ' –
- 1. ¿Cómo obtener el nombre de vista actual de la plantilla de diseño en Rails?
- 2. Encuentra el registro más nuevo en Rails 3
- 3. Rails3 obtener el nombre del diseño actual dentro de la vista
- 4. Rails 3: ¿Obtener el espacio de nombres actual?
- 5. ¿Cómo obtener el método actual en Rails 3?
- 6. ASP.NET MVC 3 Vista parcial en la página de diseño
- 7. Rails 3: Variable de pantalla del controlador en la vista
- 8. Cómo desplazar el diseño que tiene 3 vista de lista
- 9. rails 3: diseño para rutas con espacios de nombres
- 10. Vista personalizada en el diseño xml
- 11. Encuentra el idioma del teclado Android actual
- 12. ¿Qué problemas encuentra con esta vista en el diseño impulsado por dominio?
- 13. RenderAction no encuentra el método de acción en el controlador actual en el área actual
- 14. Obtener el diseño de la vista
- 15. Cambiando pestaña actual en Rails
- 16. Traducir JSON en Rails 3
- 17. Enrutamiento de Rails 3 según el contexto
- 18. Integrar Jasper en Rails 3
- 19. vista personalizada con el diseño
- 20. Rails 3 Codificación :: CompatibilityError
- 21. Rails 3 Modificación updated_at
- 22. Acceder a la solicitud actual en la vista Express/Jade
- 23. Llamar a las funciones de JavaScript desde la vista en Rails 3
- 24. ¿Inflar una vista/diseño en otro diseño?
- 25. Rails 3 en dreamhost?
- 26. Atributos anidados en Rails 3
- 27. Rails 3 - Validación personalizada
- 28. Rails 3: f.select - options_for_select
- 29. La vista no encuentra ViewModel en un ensamblaje diferente
- 30. Rails 3 vs Sinatra
Esto funcionó muy bien para mí. Para agregar un poco más de detalle, en Rails 3 lo agregué a un nuevo archivo config/initializers/custom_renderer.rb, y luego en la vista pude acceder a @ last_template.variable_name para obtener, por ejemplo, "new" –
' ActionView :: Rendering' ya no existe en Rails 3.1. – Behrang