'不存在的东西' 命名错误: “页面”的未定义方法“映射”:字符串 #./app/controllers/pages\u controller.rb:5:in'base\u page\u processor' #./spec/controllers/pages\u controller\u spec.rb:37:in'block(3层)in' 以0.10557秒完成 4例,1例失败 失败的示例: rspec./spec/controllers/pages_controller_spec.rb:36 35; PagesController模板不存在时的自动路径应呈现404页面,ruby-on-rails-3.1,static-pages,Ruby On Rails 3.1,Static Pages" /> '不存在的东西' 命名错误: “页面”的未定义方法“映射”:字符串 #./app/controllers/pages\u controller.rb:5:in'base\u page\u processor' #./spec/controllers/pages\u controller\u spec.rb:37:in'block(3层)in' 以0.10557秒完成 4例,1例失败 失败的示例: rspec./spec/controllers/pages_controller_spec.rb:36 35; PagesController模板不存在时的自动路径应呈现404页面,ruby-on-rails-3.1,static-pages,Ruby On Rails 3.1,Static Pages" />

Ruby on rails 3.1 Rails 3.1和静态页面 我正处于将大型应用程序从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 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 当模板不存在时 应呈现404页(失败-1) 失败: 1) 当模板不存在时,PagesController自动路径应呈现404页面 失败/错误:获取'base\u page\u processor',:base\u page=>'不存在的东西' 命名错误: “页面”的未定义方法“映射”:字符串 #./app/controllers/pages\u controller.rb:5:in'base\u page\u processor' #./spec/controllers/pages\u controller\u spec.rb:37:in'block(3层)in' 以0.10557秒完成 4例,1例失败 失败的示例: rspec./spec/controllers/pages_controller_spec.rb:36 35; PagesController模板不存在时的自动路径应呈现404页面

Ruby on rails 3.1 Rails 3.1和静态页面 我正处于将大型应用程序从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 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 当模板不存在时 应呈现404页(失败-1) 失败: 1) 当模板不存在时,PagesController自动路径应呈现404页面 失败/错误:获取'base\u page\u processor',:base\u page=>'不存在的东西' 命名错误: “页面”的未定义方法“映射”:字符串 #./app/controllers/pages\u controller.rb:5:in'base\u page\u processor' #./spec/controllers/pages\u controller\u spec.rb:37:in'block(3层)in' 以0.10557秒完成 4例,1例失败 失败的示例: rspec./spec/controllers/pages_controller_spec.rb:36 35; PagesController模板不存在时的自动路径应呈现404页面,ruby-on-rails-3.1,static-pages,Ruby On Rails 3.1,Static Pages,这在Rails 3.0中确实有效。必须使用模板\u exists方法更改某些内容。这是控制器: 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

这在Rails 3.0中确实有效。必须使用模板\u exists方法更改某些内容。这是控制器:

  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
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 PagesController404
结束
结束
结束
解决方案代码:

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
class PagesController404
结束
结束
结束
我还注意到它没有呈现错误视图(即:/public/404.html),所以我创建了一个目录app/views/errors,将所有错误静态页面放在那里,现在就呈现它们。它起作用了


谢谢Andrew。

模板存在方法参数表明第二个参数prefix应该是数组。通常Rails方法通过将某些内容转换为数组(如果不是)来接受这两种方法,所以这有点不寻常

exists?(name, prefixes = [], partial = false, keys = [])
此方法也被别名为模板_是否存在

# 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
因此,让
查看\u前缀=[“页面”]
应该有效吗?(并相应地修改剩余的字符串插值)