我刚刚开始使用Ruby on Rails,并且遇到了从特定视图链接到控制器中的另一个动作的问题。我几乎可以确定这是routes.rb
文件中的问题(或缺少代码),但我认为我误解了这个文件是如何工作的。我必须做什么我有一个解决方案,但很确定它不是“最佳方式”。
我有一个名为home
的控制器,其中有两个操作,index
(默认值)和newbill
。在index.html.erb
里面我有:
<h1>Home View</h1>
<%= link_to "new", :controller => "home", :action => "newbill" %>
但是我遇到了路由错误:
No route matches {:controller=>"home", :action=>"newbill"}
执行rake routes
给出了以下内容:
root / {:controller=>"home", :action=>"index"}
然后我(跟随一些谷歌搜索)将此代码添加到routes.rb
match 'home/newbill' => 'home#newbill', :as => :newbill
然后在我index.html.erb
我得到了这个:
<%= link_to "Name", newbill_path %>
现在这可以按预期工作了。我的问题是:
match 'home/newbill'...
似乎是一种垃圾处理方式。我真的很喜欢Ruby,但是在Rails的这个方面有点挣扎......总的来说路由有点让我觉得搞砸了!
非常感谢任何帮助:D
谢谢,
杰克
答案 0 :(得分:8)
我猜您的代码第一次无效,因为您的home
控制器被定义为资源。
如果您将控制器定义为routes.rb
文件中的资源,它将仅支持7种标准方法(根据REST架构):
index
new
create
show
edit
update
destroy
如果你需要更多的自定义路线,你应该手动添加它们,比如你的情况'newbill',可以是:
resources :home do
collection do
get :newbill
end
end
但是根据我的理解,你的newbill方法应该转到bills
控制器new
,方法不在家庭控制器中。
你是对的,Rails路线有点令人困惑(至少对我而言),但一旦你明白你可以做很多很酷的东西。
请阅读Rails官方路线文档:
答案 1 :(得分:7)
您应该查看Rails Routing guide。通读将帮助您了解幕后发生的事情。
答案 2 :(得分:0)
这是因为rails会通过路由器过滤每个请求以查找匹配项。这使您可以在路径实际为blog#post时定义域名/路径等自定义路由。在rails 3之前,catch-all路由是routes文件中的最后一个路由。这允许您定义控制器和操作,它只会工作。我在我的iPad上并没有接近任何项目,所以我无法验证它,但我认为这条路线仍然存在于rails 3.1中,它只需要被评估。