Rails 3.1 y páginas estáticas
-
25-10-2019 - |
Pregunta
Estoy en medio de actualizar una gran aplicación de Rails 3 a Rails 3.1 y golpeé un problema con mi implementación del controlador de páginas:
when templates doesnt exist
should render the 404 page (FAILED - 1)
Failures:
1) PagesController automatic paths when templates doesnt exist should render the 404 page
Failure/Error: get 'base_page_processor', :base_page => 'something_that_doesnt_exist'
NoMethodError:
undefined method `map' for "pages":String
# ./app/controllers/pages_controller.rb:5:in `base_page_processor'
# ./spec/controllers/pages_controller_spec.rb:37:in `block (3 levels) in <top (required)>'
Finished in 0.10557 seconds
4 examples, 1 failure
Failed examples:
rspec ./spec/controllers/pages_controller_spec.rb:36 # PagesController automatic paths when templates doesnt exist should render the 404 page
Esto funcionó en Rails 3.0. Algo debe cambiar con el método Template_Exists. Aquí está el controlador:
class PagesController < ApplicationController
def base_page_processor
view_prefix = "pages"
if params[:base_page].present? && template_exists?(params[:base_page], view_prefix)
render "#{view_prefix}/#{params[:base_page]}"
else
#TODO : Notify missing url via email error or error notification service
render '/public/404.html', :status => 404
end
end
end
Código de solución:
class PagesController < ApplicationController
def base_page_processor
view_prefix = ["pages"]
if params[:base_page].present? && template_exists?(params[:base_page], view_prefix)
render "#{view_prefix[0]}/#{params[:base_page]}"
else
#TODO : Notify missing url via email error or error notification service
render '/errors/404.html', :status => 404
end
end
end
También noté que no estaba haciendo las vistas de error (es decir: /public/404.html), así que creé una aplicación de directorio/vistas/errores y puse todas las páginas estáticas de error allí y simplemente las presenta ahora. Funciona.
Gracias Andrew.
Solución
los template_exists
Los parámetros del método indican que el segundo parámetro, prefijo, debe ser una matriz. Normalmente, los métodos de rieles aceptan ambos convirtiendo algo en una matriz si no, por lo que esto es ligeramente inusual.
exists?(name, prefixes = [], partial = false, keys = [])
¿Este método también está alias como Template_Exists?
# File actionpack/lib/action_view/lookup_context.rb, line 93
def exists?(name, prefixes = [], partial = false, keys = [])
@view_paths.exists?(*args_for_lookup(name, prefixes, partial, keys))
end
Así que hacer view_prefix = ["pages"]
¿Deberia trabajar? (y modificar la interpolación de cadena restante en consecuencia)