【问题标题】:How can I display only a range of values in a rails form view?如何在 Rails 表单视图中仅显示一系列值?
【发布时间】:2015-07-20 10:12:44
【问题描述】:

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

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>

【问题讨论】:

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


    【解决方案1】:

    您的停靠点应通过 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 来查询获取路线的停靠点列表每次选择新路线时。

    【讨论】:

    • 我添加了一些关于我的关联的信息。我无法更改它们,因为这是大学的一个项目,我的教授说必须通过belongs_to关联将停靠点链接到路线。但是一条路线有很多停靠点……我尝试了您的第二个建议,但没有不工作。它说'未定义的方法'for_route''。还是谢谢你!
    • 我更新了我的帖子。 for_route 暗示是在 Stop 模型上创建的自定义范围,但我并不清楚。
    • 非常感谢您清晰而有帮助的解释。
    猜你喜欢
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    相关资源
    最近更新 更多