0

我对 Rails 很陌生,我对视图有一些问题......
我有这三种模型:预订路线停止
预订时,您必须选择路线和出发/到达城市。
编辑

class Route < ActiveRecord::Base
  has_many :stops, :dependent => :destroy
  has_many :reservations, :dependent => :destroy
  belongs_to :train
end.

    class Stop < ActiveRecord::Base
  belongs_to :route
  has_many :reservation_deps, class_name: "Reservation", foreign_key: "dep_city_id"
  has_many :reservation_arrs, class_name: "Reservation", foreign_key: "arr_city_id"
end

class Reservation < ActiveRecord::Base
  belongs_to :user
  belongs_to :route
  belongs_to :arr_city, class_name: "Stop",foreign_key: "arr_city_id"
  belongs_to :dep_city, class_name: "Stop",foreign_key: "dep_city_id"
end

我不知道这是否可能,但我希望能够仅在属于我选择的路线的城市中选择我的出发/到达城市。任何想法如何做到这一点?

谢谢!

下面是我的预订表格的一部分:

<div class="field">
      <%= f.label :route %><br>
    <%= f.collection_select(:route_id,Route.all,:id,:as_field) %><br>
  </div>
  <div class="field">
      <%= f.label :departure_city %><br>

      <%= f.collection_select(:dep_city_id,Stop.all,:id,:city) %><br>
  </div>
  <div class="field">
      <%= f.label :arrival_city %><br>

      <%= f.collection_select(:arr_city_id,Stop.all,:id,:city) %><br>
  </div>
4

1 回答 1

0

您的停靠点应通过 has_and_belongs_to 或 has_many :through 关系正确链接到您的路线,因为路线可以包含许多停靠点,而停靠点可以属于许多路线。因此,假设您在预订页面上加载了一条路线,您应该能够执行以下操作

<%= f.collection_select :dep_city_id, @route.stops.all, :id, :name %>
<%= f.collection_select :arr_city_id, @route.stops.all, :id, :name %>

或者像

编辑:即使停止关系的路线是一对多,这也将起作用。

<%= f.collection_select :dep_city_id, Stop.for_route(params[:route_id]), :id, :name %>

编辑2:

在这种情况下,您应该在 Stop 模型中添加了一个 for_route 范围,这只是一个

scope for_route -> (route_id) { where(:route_id => params[:route_id]) }

在基本情况下,您将有一个包含您的路线的页面,您选择一条路线(链接或其他内容),然后被带到您可以进行预订的页面。第一页会有这样的东西

<% @routes.each do |route| %>
  <%= link_to route.name, new_reservation_path(:route_id => route.id) %>
<% end %>

上面代码生成的链接应该链接到 /reservation?route_id=XXX 之类的东西

当 reservations_controller#new 运行时,您知道路由 ID 是什么,因此您可以使用 @route = Route.find(params[:route_id]) 之类的内容加载它

然后,在呈现页面时,您将能够使用我在第一个示例代码中指定的 f.collection_select 帮助器。

在最后一种情况下,您不知道用户将选择哪条路线,直到他们在预订页面上选择了一条路线,它变得更加复杂,您必须开始使用 JS 来查询获取路线的停靠点列表每次选择了新的路线。

于 2015-07-20T10:21:06.140 回答