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.

¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top