使用"news_path"作为:news资源不能与`No route matches {:action =>"show",:controller =>"admin/news"}缺少必需的键:[:id]'

Har*_*and 3 routes ruby-on-rails

我正在实现一个管理子域名,并已谷歌搜索尝试找到这个答案,但我没有找到另一个实例.

对于子域部分,我的路由如下所示:

constraints :subdomain => 'admin' do
  scope :module => "admin" do

    resources :news, :events
    match 'news', :to => 'news#index', :as => 'news'

    root :to => "dashboard#index"
  end
end
Run Code Online (Sandbox Code Playgroud)

事件工作正常,但出于某种原因,为了使新闻工作,我需要添加一个特定的路线来匹配它.显示生成错误的部分位置(admin/shared/menu)可能会有所帮助:

<ul>
    <li><%= link_to 'Home', root_path, :class => "#{current_class?(root_path)}" %></li>
    <li><%= link_to 'News', news_path, :class => "#{current_class?(news_path)}" %></li>
    <li><%= link_to 'Events', events_path, :class => "#{current_class?(events_path)}" %></li>
    <div class="clearboth"></div>
</ul>
Run Code Online (Sandbox Code Playgroud)

然后错误,如果我要删除匹配路线:

No route matches {:action=>"show", :controller=>"admin/news"} missing required keys: [:id]
Run Code Online (Sandbox Code Playgroud)

我只是不知道为什么,有什么想法?

Har*_*and 10

我发现这是rails的一个问题,因为多个问题,新闻 - >新的不应该使用命名约定新闻,因此我不得不将所有内容重命名为文章.我本人的监督,有点愚蠢.

  • "*新闻 - >新*"并不完全正确; 你有没有听过有人说"一篇有趣的新文章";-)?问题是,在"新闻"的情况下,它是***单数*和*复数的相同单词.你不需要将`News`重命名为其他东西,你只需要使用`news_index_path`而不是`news_path`(另见[我的回答](http://stackoverflow.com/a/27678933/660921)) . (3认同)

Mar*_*oij 5

Rails感到困惑的原因是因为“新闻”用于单数和复数。news'.singularizenews; 并news.pluralize给出了答案news维基百科对此现象进行了更详细的描述;也有其他词也做同样的事情)。

Rails将生成一条news_path路线(对于index动作,是复数)和一条news_path路线(对于show动作,是单数)。
奇异路线需要一个News实例;似乎该show动作是在以后定义的,并且会覆盖索引动作,从而导致奇怪的行为。

解决方案很简单:news_index_path如果需要索引操作,请使用。我没有遇到任何其他问题,并且仍在使用该News模型。

ActiveAdmin以相同的方式解决了此问题

如果你真的不想使用News,那么你可以用它后缀ItemEntryObject,或类似的话。这将为您提供NewsItem带有news_item_path和的模型news_items_path