从一开始就让我公平,告诉你我已经解决了这个问题。我正在描述的问题。但是,你不了解的解决方案并不是真正的解决方案,现在是吗?
我有一个资源,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
来解决这个问题。但这并不能帮助我理解。如果这不是网站的根本怎么办?
非常感谢任何帮助。
答案 0 :(得分:1)
实际上,我对你的代码工作感到非常惊讶。路线必须定义两件事
newsbites/frontindex
与newsbites/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/:id
和GET newsbite/frontindex
,那么首先出现的那个将会匹配。在你的情况下,这是第一个。
也许试着改变顺序。