rails 4路由错误与新控制器

时间:2014-11-25 02:19:03

标签: ruby-on-rails

我刚刚生成了一个控制器,当我尝试使用它访问任何路由时,rails只给我一个UrlGenerationError。

# Error message
ActionController::UrlGenerationError in NaturalProductsController#organic
No route matches {:action=>"home", :controller=>"natural_products", :locale=>:en}

问题似乎是当我的控制器甚至没有“家”时,它正在使用{:action=>"home"。任何东西。但我不能为我的生活弄清楚为什么,因为我使用link_to t("organic.link"), organic_path甚至手动输入localhost:3000/en/organic会得到同样的错误。

配置/ routes.rb中

Rails.application.routes.draw do

  scope "(:locale)", locale: /en|pt|nb/  do
    root              'company_name#home'
    get 'about'    => 'company_name#about'
    get 'contact'  => 'company_name#contact'
    get 'products' => 'company_name#products'
    get 'organic'     => 'natural_products#organic'
  end

http://localhost:3000/rails/info/routes

root_path       GET /(:locale)(.:format)          company_name#home {:locale=>/en|pt|nb/}
about_path      GET (/:locale)/about(.:format)    company_name#about {:locale=>/en|pt|nb/}
contact_path    GET (/:locale)/contact(.:format)  company_name#contact {:locale=>/en|pt|nb/}
products_path   GET (/:locale)/products(.:format) company_name#products {:locale=>/en|pt|nb/}
organic_path        GET (/:locale)/organic(.:format)      natural_products#organic {:locale=>/en|pt|nb/}

我正在使用rails 4.2.0beta4和kubuntu 14.04。

编辑:完整堆栈跟踪,根据要求。我的应用程序中唯一的部分是标题和应用程序视图。我会仔细检查它们,但它们已经可以与现有的控制器一起使用。

Edit2:我发现了问题,用它来回答。此外,不需要完整的堆栈跟踪。

app/views/layouts/_bootstrap_header.html.haml:15:in `_app_views_layouts__bootstrap_header_html_haml__3398608881953314325_70155715867000'
app/views/layouts/application.html.haml:18:in `_app_views_layouts_application_html_haml__2085176017777231976_43442360'

2 个答案:

答案 0 :(得分:1)

我不确定这是否会解决所有问题,但link_to会将锚文本作为第一个参数。

而不是link_to organic_path,它应该是link_to 'click here', organic_path或类似的。

答案 1 :(得分:0)

我有一个包含这些链接的头文件,当我只有一个控制器时它们运行良好。

%li{class: ("active" if current_page?(action: "home"))}
  =link_to t("home.link"),      root_path

%li{class: ("active" if current_page?(action: "products"))}
  =link_to t("products.link"),  products_path

......等等。

现在,当我添加第二个控制器并尝试访问它时,它使用新控制器运行`current_page?(action:" home")...

修复是指定一个控制器,如下所示:

%li{class: ("active" if current_page?(action: "home", controller: "company_name"))}
  =link_to t("home.link"),      root_path

对不起,如果我浪费了任何时间,我应该更好地跟踪堆栈跟踪开始... +1给那个让我看到错误的海洋公司。