【问题标题】:Using Ruby on Rails link_to to link to controller action使用 Ruby on Rails link_to 链接到控制器操作
【发布时间】:2011-11-18 23:06:02
【问题描述】:

我刚开始使用 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 %>

现在这按预期工作了。然而,我的问题是:

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

我真的很喜欢 Ruby,但是在 Rails 的这方面有点挣扎……我认为一般的路由有点让我头疼!

非常感谢任何帮助:D

谢谢,

杰克

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3.1


    【解决方案1】:

    我猜你的代码第一次不起作用是因为你的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.

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我们知道那里有文档。 -1 如果可以的话,因为这并不能提供任何真正的帮助。
      • @karns 此人的问题是“为什么以规定的方式使用路由引擎?”。我可以费力地输入真正的答案(这已经在 Rails 路由指南中完成了),或者只是将他指向它们。他想了解路由是如何工作的,并且有一个清晰的官方文档对其进行了非常详细的解释。我没发现问题?
      【解决方案3】:

      这是因为 rails 通过路由器过滤每个请求以寻找匹配项。当路径实际上是 blog#post 时,这使您能够定义自定义路由,例如 domain.com/post。在 rails 3 之前,一条包罗万象的路线是路线文件中的最后一条路线。这允许您定义控制器和操作,并且它会正常工作。我在我的 iPad 上,并且没有靠近任何项目,所以我无法验证它,但我认为该路线在 rails 3.1 中仍然存在,只是需要取消注释。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-02
        相关资源
        最近更新 更多