Rails link_to带有字符串参数的非资源路由

时间:2013-03-08 04:05:03

标签: ruby-on-rails ruby-1.9.3

我正在使用Rails(3.2.11)中的Ruby(1.9.3)中的航班跟踪应用程序。此应用程序有一个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)上,我创建了一个尾数表和每个尾数的表,打算将尾号链接到相应的show视图:

<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的链接({{ 1}})。这个链接显然不会把我送到我想要的航班#show_tail。

我已成功为其他与Flight(机场,旅程)和Flight本身的索引相关联的模型创建了索引,并且它们都可以通过使用我正在尝试的/tails.N909EV语法来工作用于尾号。因此,如果Tail_Number是一个模型并且我可以用同样的方式对待它,这将是非常微不足道的,但是仅仅是模型而不是给定飞行的属性似乎太微不足道了。

我假设它不适合我的原因是,当我使用link_to trip.name, trip_path(trip)时,trip_path(trip)是一个对象,而在trip中,tails_path(tail_number)是一个串。但我不确定我应该如何链接到它。我已尝试像Rails link_to action with URL parameters中的命名路由之类的解决方案,但如果我这样做,我会遇到相同的tail_number问题,所以我又回到了上面列出的内容。

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

1 个答案:

答案 0 :(得分: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)来避免其他操作出现问题。