Rails 3.1 et pages statiques
-
25-10-2019 - |
Question
Je suis juste au milieu de la mise à niveau d'une grande application dans Rails 3 à Rails 3.1 et a frappé un problème avec ma mise en œuvre du contrôleur pages:
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
travaillèrent à Rails 3.0. Quelque chose de changé avec la méthode template_exists. Voici le contrôleur:
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
Code Solution:
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
J'ai aussi remarqué qu'il ne rendait les vues d'erreur (par exemple: /public/404.html) donc je créé un répertoire app / vues / erreurs et de mettre toutes les pages statiques d'erreur là-bas et les restituent maintenant. Il fonctionne.
Merci Andrew.
La solution
Les paramètres de la méthode de template_exists
indiquent que le deuxième paramètre, le préfixe, doit être un tableau. Normalement, les méthodes Rails acceptent à la fois en convertissant quelque chose à un tableau sinon, si cela est un peu inhabituel.
exists?(name, prefixes = [], partial = false, keys = [])
Cette méthode est également Lissé comme 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
Donc, faire view_prefix = ["pages"]
devrait fonctionner? (Et la modification de l'interpolation de chaîne restant en conséquence)