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

时间:2015-07-20 10:12:44

标签: ruby-on-rails ruby-on-rails-4 views collection-select

我对rails非常陌生,我对视图有一些问题...
我有这三个模型:预订路线和的停止即可。
当您预订时,您必须选择路线和出发/到达城市。
EDIT

10

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

谢谢!

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

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

1 个答案:

答案 0 :(得分:0)

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

<%= 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来查询路线的停靠点列表每次选择新路线时。