我对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来查询获得每次选择新路线时该路线的站点列表。