2011-11-18 85 views
12

我刚开始玩弄Ruby on Rails,并遇到了从特定视图链接到控制器中的另一个操作的问题。我几乎肯定这是我的routes.rb文件中的一个问题(或缺少代码),但我认为我误解了这个文件的工作原理&我必须做什么。我有一个解决方案,但很确定这不是实现它的“最佳方式”。使用Ruby on Rails link_to链接到控制器动作

我有一个控制器叫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 %> 

现在这个按预期工作。我的问题是:

  1. 这是为什么这样工作?幕后究竟发生了什么?
  2. 这当然不是最好的办法吗?为我想链接的每个控制器/操作添加另一个match 'home/newbill'...似乎是一种垃圾处理方式。

我真的很喜欢Ruby,但是在Rails的这个方面挣扎了一点......一般的路由选择让我的脑子有点乱了,我想!

任何帮助是非常赞赏:d

感谢,

杰克

回答

7

你应该看看Rails Routing guide。通读将帮助您了解幕后发生的事情。

+11

我们知道那里有文档。 -1如果我可以,因为这不能提供任何真正的帮助。 – karns

+2

@ karns这个人的问题是“为什么在规定的时尚工作中使用路由引擎?”。我可以费力地输出真正的答案(这已经在Rails路由指南中完成了),或者直接指向他们。他想了解路由的工作原理,并且有一份清晰的官方文档详细解释了它。我没有看到问题? –

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的官方路线文档:

http://guides.rubyonrails.org/routing.html

0

这工作监守轨过滤器经过路由器的每个请求寻找匹配。这使您能够在路径实际上是博客#发布时定义自定义路线,例如domain.com/post。在导轨3之前,全路径是路由文件中的最后一个路由。这可以让你定义一个控制器和动作,它只是工作。我在我的iPad上,并没有接近任何项目,所以我无法验证它,但我认为该路线仍然存在于rails 3.1中,只需要进行umcommented。