【问题标题】:Update Second Drop Down Menu Based on Selection in the First Drop Down根据第一个下拉菜单中的选择更新第二个下拉菜单
【发布时间】:2015-02-19 20:04:15
【问题描述】:

我正在用 Ruby on Rails 构建一个电影院应用程序,目前正在研究预订系统。我想要做的是从下拉菜单中选择一部电影,然后该电影的放映时间显示在下拉菜单中,用户可以选择放映时间,然后可用座位显示在下拉菜单。

我看过这个视频:https://www.youtube.com/watch?v=GYg6s-b1XGo 并看过很多其他网站,但我想做的事情有点复杂。

好的,我的models/bookings.rb:

class Booking < ActiveRecord::Base
    belongs_to :user
    belongs_to :showing
    belongs_to :seat
end

models/showing.rb:

class Showing < ActiveRecord::Base
  belongs_to :film
  has_many :bookings
  belongs_to :screen

  def showing_times
    "#{show_date.strftime("%e %b %Y")} @ #{show_time.strftime("%H:%M")}"
  end
end

models/seats.rb:

class Seat < ActiveRecord::Base
    belongs_to :screen
    has_many :bookings

    def seats_available
        "#{row_letter}#{row_number}"
    end
end

这就是复杂的地方,我的观点/bookings/_form.html.erb:

             <%= form_for @booking do |f| %>
                <%= f.hidden_field :user_id %>
                <%= image_tag "thor_hammer.jpg",:size => "900x250" %>
                <td width="300px">

                    <br><%= f.label :film_id, 'Film:' %>
                    <br><%= f.collection_select :film_id, Film.all, :id,:title_info %>

                    <br><%= f.label :showing_id, 'Showing:' %>
                    <br><%= f.collection_select :showing_id, Showing.all, :id,:showing_times %>

                    <br><%= f.label :seat_id, 'Seat ID:' %>
                    <br><%= f.collection_select :seat_id, Seat.all, :id,:seats_available %><br>
                </td>
                <td width="300px">
                    <div class="actions">
                      <%= f.submit %>
                    </div>
                    <br>    
                    <%= render "/error_messages", :message_header => "Cannot save: ", :target => @booking %> 
                </td>
            <% end %> 

这是变得复杂的地方,因为&lt;%= f.collection_select :film_id, Film.all, :id,:title_info %&gt; 行会导致错误:

NoMethodError in Bookings#new 
undefined method `film_id' for #<Booking:0x584e6b0>

因为预订数据表不存储电影,它存储放映时间,并且有与之关联的电影,对于座位也是如此:用户需要能够选择放映才能选择座位但showings表与screens表相关联,与seats相关联。

为了更清楚,这里是架构:

create_table "bookings", force: :cascade do |t|
  t.integer  "user_id"
  t.integer  "showing_id"
  t.integer  "seat_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

create_table "films", force: :cascade do |t|
  t.string   "title"
  t.string   "synopsis"
  t.string   "director"
  t.string   "cast1"
  t.string   "cast2"
  t.string   "cast3"
  t.date     "release_date"
  t.string   "warnings"
  t.datetime "created_at",     null: false
  t.datetime "updated_at",     null: false
  t.string   "image_url"
  t.string   "certificate_id"
  t.integer  "category_id"
  t.integer  "hours"
  t.integer  "minutes"
  t.string   "video_url"
end

create_table "screens", force: :cascade do |t|
  t.string   "name"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

create_table "seats", force: :cascade do |t|
  t.string   "row_letter"
  t.integer  "row_number"
  t.integer  "screen_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

create_table "showings", force: :cascade do |t|
  t.date     "show_date"
  t.time     "show_time"
  t.integer  "film_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.integer  "screen_id"
end

有人有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails ruby drop-down-menu


    【解决方案1】:

    您正在尝试设置Booking 类实例的film_id。您正确地注意到bookings 表中没有film_id

    实现您想要的最简单的方法就是将film_id 添加到bookings 表并在BookingFilm 之间创建has_onebelongs_to 关联。

    实现此目的的另一种方法是使用 accepts_nested_attributes_for,这需要您深入了解 Rails。这是一个很好的tutorial,如果您遇到第一个问题,这是一个newer tutorial。这将使您不必创建冗余关联。

    更新 1

    在仔细研究了您要执行的操作后,我意识到您不是在尝试创建新资源(电影),因此请忽略我之前关于嵌套属性的评论。

    您尝试做的事情的解决方案涉及一些移动部件,这些部件有点太长,无法给出这样的答案。不过,这里有一个总结,可以在您尝试弄清楚时为您提供指导:

    • 您需要一个单独的表格来首先选择电影
    • 根据电影选择,您可以使用 ajax 获取属于该电影的所有放映(为此,您需要阅读 ajax;您还需要阅读如何通过 json 端点公开数据) rails) 您最终将传递用户选择的电影的 id,您将返回此查询的结果:Showing.where(film_id: &lt;id&gt;)
    • 在您设法获得该数据后,您需要以第二种形式填充它,最终只显示与该电影相关的放映。

    对于您要执行的操作而言,这似乎有点复杂。我建议您:

    • 花一些额外的时间来弄清楚如何以不同的方式构建模型
    • 或者您不允许用户选择电影,然后在同一页面上选择放映(动态)。让他们先选择电影。在他们选择了电影后,他们会被重定向到一个可以选择放映的页面。这会给用户带来更糟糕的体验,但它会让您更好地理解 Rails(在这种情况下不需要 ajax 和 javascript)。

    我假设您这样做是为了更好地掌握 Rails,所以我希望这些信息对您有所帮助。祝你好运!

    【讨论】:

    • 理想情况下,我不想将film_id 添加到预订表中,因为这可能会导致稍后出现一些问题,并且用户可以通过看房获得film_id。我对 Ruby on Rails 了解不多,您会如何推荐我接受_nested_attributes_for?
    猜你喜欢
    • 2017-09-19
    • 2013-11-30
    • 2019-02-14
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2012-03-23
    • 1970-01-01
    相关资源
    最近更新 更多