Rails路由问题,无法找出链接路径

时间:2015-07-18 01:14:58

标签: ruby-on-rails ruby

从一开始就让我公平,告诉你我已经解决了这个问题。我正在描述的问题。但是,你不了解的解决方案并不是真正的解决方案,现在是吗?

我有一个资源,Newsbites。我有一个Newsbites的索引页面。我的所有CRUD操作都运行正常。

我创建了一个单独的索引(frontindex.html.erb),作为我网站的首页,以显示最新的新闻报道。格式与我的普通索引不同,因此读者可以获得更大的照片,更多的文章文章(更多的广告:)。

在我的路由表中,我有以下声明:

 resources :newsbites
 get 'newsbites/frontindex'
 root 'newsbites#frontindex'

Rake路线显示以下内容:

newsbites_frontindex GET    /newsbites/frontindex(.:format)   newsbites#frontindex

如果我从root(localhost:3000)加载我的网站,它的效果很好。有一个单独的菜单页面在顶部呈现,它加载正常。我可以点击所有链接,但' Home'链接,他们工作正常。

' Home'链接是:

 <%= link_to 'Home', newsbites_frontindex_path %>

当我点击链接时,我收到以下错误:

Couldn't find Newsbite with 'id'=frontindex

错误指向&#39; show&#39;我的Newbites控制器的动作。这是frontindex并显示来自控制器的def。它们看起来就像我发布它们一样:

  def frontindex
  @newsbites = Newsbite.all
  end


  def show
   @newsbite = Newsbite.find(params[:id])
  end

我不明白。当def和视图匹配时,为什么newbites_frontindex_path会调用show动作?现在,我可以通过简单地指向root_path来解决这个问题。但这并不能帮助我理解。如果这不是网站的根本怎么办?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

实际上,我对你的代码工作感到非常惊讶。路线必须定义两件事

  • 与用户的网址匹配的某种正则表达式(newsbites/frontindexnewsbites/backindex不同)
  • 您想为给定的网址做些什么?您想指向控制器操作

Rails通常不会&#34;猜测&#34;那是什么动作。或许,他仍然能够猜测&#34;您想要使用newsbites控制器,但这次没有正确的猜测:(。

您应该像这样声明root,这就是您所做的

root 'controller#action'

对于其他人,有两种方法可以声明它。我更喜欢第二个

resources :newsbites
get 'newsbites/frontindex', to: 'newsbites#frontindex'

resources :newsbites do
  # stuff added here will have the context of the `newsbites` controller already
  get 'frontindex', on: :collection # the name of the action is inferred to be `frontindex`
end

on: :collection表示&#39; frontindex&#39;是一个涉及所有新闻网站的操作,因此生成的网址为newsbites/frontindex

另一方面,get 'custom_action', on: :member表示custom_action定位特定项目,生成的网址看起来像newsbites/:id/custom_action

编辑:Rails还会根据路由声明生成path_helpers

get 'test', to: 'newsbites#frontindex'
get 'test/something', to: 'newsbites#frontindex'
resources :newsbites do
      get 'frontindex', on: :collection
      get 'custom_action', on: :member

将生成路径助手

test_path
test_something_path
# CRUD helpers : new/edit/show/delete, etc. helpers
frontindex_newsbites_path
custom_actions_newsbite_path(ID) # without s !

您始终可以通过添加as:选项

来覆盖此设置
get 'custom_action', on: :member, as: 'something_cool'
# => something_cool_newsbites_path

答案 1 :(得分:0)

Rails路由认为frontindex是一个id。这就是错误信息所说的内容。所以它转到GET newsbite/:id,映射到show

您需要找到一种方法让Rails路由知道frontindex不是id

旁注:您定义路线的顺序很重要。匹配的第一个将被使用。如果您有GET newsbite/:idGET newsbite/frontindex,那么首先出现的那个将会匹配。在你的情况下,这是第一个。 也许试着改变顺序。