使用Ruby on Rails link_to链接到控制器操作

Jac*_*lin 12 ruby ruby-on-rails ruby-on-rails-3.1

我刚刚开始使用Ruby on Rails,并且遇到了从特定视图链接到控制器中的另一个动作的问题.我几乎可以肯定这是我routes.rb文件中的一个问题(或缺少代码),但我认为我误解了这个文件是如何工作的以及我必须做什么.我有一个解决方案,但很确定这不是"最好的方法".

我有一个控制器调用home两个动作,index(这是默认值)和newbill.里面index.html.erb我有:

<h1>Home View</h1>
<%= link_to "new", :controller => "home", :action => "newbill" %>
Run Code Online (Sandbox Code Playgroud)

但是我遇到了路由错误:

No route matches {:controller=>"home", :action=>"newbill"}
Run Code Online (Sandbox Code Playgroud)

rake routes了给我以下内容:

root  / {:controller=>"home", :action=>"index"}
Run Code Online (Sandbox Code Playgroud)

然后我(跟随一些谷歌搜索)添加此代码 routes.rb

match 'home/newbill' => 'home#newbill', :as => :newbill
Run Code Online (Sandbox Code Playgroud)

然后在我,index.html.erb我有这个:

<%= link_to "Name", newbill_path %>
Run Code Online (Sandbox Code Playgroud)

现在这可以按预期工作.我的问题是:

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

我真的很喜欢Ruby,但是在Rails的这个方面有点挣扎......一般来说,路由有点让我觉得搞砸了!

非常感谢任何帮助:D

谢谢,

插口

sam*_*207 8

我猜你的代码第一次不起作用,因为你的home控制器被定义为资源.

如果将控制器定义为routes.rb文件中的资源,它将仅支持7种标准方法(根据REST架构):

index
new
create
show
edit
update
destroy
Run Code Online (Sandbox Code Playgroud)

如果你需要更多的自定义路线,你应该手动添加它们,比如你的情况'newbill',可以如下:

resources :home do
    collection do
      get :newbill
    end
end
Run Code Online (Sandbox Code Playgroud)

但根据我的理解,你的newbill方法应该转到bills控制器new,而不是家用控制器中的方法.

你是对的,Rails路线有点令人困惑(至少对我而言),但一旦你明白你可以做很多很酷的事情.

在这里阅读Rails官方路线文档:

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


Bre*_*der 7

您应该查看Rails路由指南.通读将帮助您了解幕后发生的事情.

  • 我们知道那里有文档.-1如果可以,因为这不提供任何真正的帮助. (13认同)
  • @karns这个人的问题是"为什么以规定的方式使用路由引擎工作?".我可以费力地输入真正的答案(已经在Rails路由指南中完成)或者只是指向他们.他想了解路由的工作原理,并且有一份清晰的官方文档可以非常详细地解释它.我没有看到问题? (2认同)