【问题标题】:Rails link_to Non-Resourceful Route with String Parameter带有字符串参数的 Rails link_to 非资源路由
【发布时间】:2013-03-08 04:05:02
【问题描述】:

我正在使用 Ruby (1.9.3) on Rails (3.2.11) 开发航班跟踪应用程序。这个应用程序有一个Flight 类,其中有一个字符串列tail_number 用于跟踪执行飞行的飞机的tail number

我正在尝试为尾号创建一个索引视图,显示尾号列表和每个尾号的计数,并链接到一个视图,该视图将显示所有具有该尾号的Flights我的显示页面可以正常工作,但我无法让 link_to 在索引页面上正常工作。

显示视图由 flights 控制器的 show_tail 操作处理,我在 routes.rb 中设置了该操作:

match '/tails' => 'flights#index_tails'
match '/tails/:tail_number' => 'flights#show_tail'

飞控按尾号对航班进行分组并提供计数:

def index_tails
  @flight_tail_numbers = Flight.where("tail_number IS NOT NULL").group("tail_number").count
end

在我的尾号索引页面 (/app/views/flights/index_tails.html.erb) 上,我创建了一个尾号表和每个尾号的计数,旨在将尾号链接到适当的显示视图:

<h1>Tail Numbers</h1>

<table>
<% @flight_tail_numbers.each do |tail_number, count| %>
  <tr>
    <td><%= link_to(tail_number, tails_path(tail_number)) %></td>
    <td><%= count %>
  </tr>
<% end %>
</table>

但是,不是像我希望的那样,link_to 创建指向 /tails/tail_number 的链接(例如,/tails/N909EV),而是创建指向 /tails.tail_number (/tails.N909EV) 的链接。此链接显然不会将我发送到我想要的航班#show_tail。

我已经成功地为与 Flight (Airports, Trips) 关联的其他模型创建了索引,并为 Flight 本身创建了索引,并且它们都通过使用例如我尝试使用的 link_to trip.name, trip_path(trip) 语法来工作对于尾号。因此,如果 Tail_Number 是一个模型,这将是非常微不足道的,我可以以同样的方式对待它,但它似乎太微不足道了,而不是给定航班的一个属性。

我假设它对我不起作用的原因是,当我使用 trip_path(trip) 时,trip 是一个对象,而在 tails_path(tail_number) 中,tail_number 是一个字符串。但我不确定我应该如何链接到它。我已经尝试过像Rails link_to action with URL parameters 中的命名路由这样的解决方案,但是如果我这样做,我会遇到同样的undefined method 问题,所以我恢复到上面列出的内容。

我应该如何格式化我的 link_to 以使其正常工作?

【问题讨论】:

    标签: ruby-on-rails ruby-1.9.3


    【解决方案1】:

    由于操作 :show_tail 不是 RESTful 操作,您需要在 :as 语句中分配它。

    您可以更改路线以支持您正在尝试的内容:

    match '/tails/:tail_number' => 'flights#show_tail', :as => :tails
    

    这将允许它匹配tails_path

    我可能会把它命名为

    match '/tails/:tail_number' => 'flights#show_tail', :as => :show_tails
    

    并使用show_tails_path(tail_number) 来避免其他操作出现问题。

    【讨论】:

    • 效果很好,谢谢。出于某种原因,我尝试重命名路由并链接到该路由,但从未想过要在其中添加 _path
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2017-12-11
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2012-08-02
    相关资源
    最近更新 更多