如何在rails表单视图中仅显示一系列值?



我对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>

站点应该通过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?XXX route_id =

当reservations_controller#new运行时,您知道路由ID是什么,因此您可以使用@route = route .find(params[:route_id])

加载它

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

在最后一种情况下,你不知道用户会选择哪条路线,直到他们在预订页面上选择了一条路线,这就变得更复杂了,你将不得不开始使用JS来查询获得每次选择新路线时该路线的站点列表。

最新更新