Rails 3.1 и статические страницы - PullRequest
       20

Rails 3.1 и статические страницы

0 голосов
/ 05 сентября 2011

Я только что приступил к обновлению большого приложения с Rails 3 до Rails 3.1 и столкнулся с проблемой с моей реализацией контроллера страниц:

  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

Это работало в Rails 3.0. Что-то должно быть изменено с помощью метода template_exists. Вот контроллер:

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

Код решения:

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

Я также заметил, что это не рендеринг представлений ошибок (то есть: /public/404.html), поэтому я создал каталог app / views / errors и поместил туда все статические страницы ошибок и просто отображал их сейчас. Это работает.

Спасибо, Андрей.

1 Ответ

1 голос
/ 07 сентября 2011

Параметры метода template_exists указывают, что второй параметр, префикс, должен быть массивом.Обычно методы Rails принимают оба, преобразовывая что-то в массив, если нет, так что это немного необычно.

exists?(name, prefixes = [], partial = false, keys = [])

Этот метод также называется псевдонимом 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

Таким образом, делая view_prefix = ["pages"] должно сработать?(и соответственно изменяя интерполяцию оставшейся строки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...