0

我正在将一个大型应用程序从 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 并将所有错误静态页面放在那里,现在就渲染它们。有用。

谢谢安德鲁。

4

1 回答 1

1

template_exists方法参数表明第二个参数prefix应该是一个数组。通常,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"]应该有效吗?(并相应地修改剩余的字符串插值)

于 2011-09-07T09:10:37.467 回答