如何传递数据变量以仅显示相关数据?

How do I pass over a data variable to show only associated data?

这可能是一个相当基本的问题,但我对 Rails 上的 Ruby 还很陌生。

在我的 Ruby on Rails 应用程序中,我有一个影院系统。我想做什么:

在 films/show 页面上,用户可以选择 'Book' 电影座位,当他们这样做时,我希望他们转到 showings/index 页面,在那里他们可以select 那部电影的放映。我遇到的问题是让 showings/index 页面只显示该电影的放映,因为目前它只是列出数据库中的所有放映。

这是 films/show 列出放映的页面,我正在尝试传递电影数据:

<% if not @film.showings.blank? %>
    <% @film.showings.each do |showing| %>
        <%= showing.show_date.strftime("%A %e %B %Y") %>@ <%= showing.show_time.strftime("%H:%M") %>
        <% if logged_in? %>
            <%= link_to 'Book', showings_path(@showing) %>
       <% end %></br>
    <% end %>
<% end %>

以及 showings/index 页面:

<% @showings.each do |showing| %>
    <tr id='sizeable'>
        <td><%= showing.show_date %></td>
        <td><%= showing.show_time %></td>
        <td><% if not showing.film.blank? %><%= showing.film.title %><% end %></td>
        <td style="padding-right:65px">
        <%= link_to 'Delete', showing_path(showing), method: :delete, data: { confirm: 'Are you sure?' } %>
        </td>
    </tr>
<% end %>

我目前的路线:

Rails.application.routes.draw do

resources :showings

get 'sessions/new'
get 'sessions/create'
get 'sessions/destroy'
controller :sessions do
    get  'login' => :new
    post 'login' => :create
    get 'logout' => :destroy
end

resources :users


get 'films/index'
get 'categories/index'
get 'certificates/index'

resources :films
resources :categories
resources :certificates
resources :showings
resources :bookings
resources :seats
resources :screens
root 'films#index'

post 'films/search', to: 'films#search'

post 'films/display_products_by_genre', :to => 'films#display_products_by_genre'
get 'films/display_products_by_genre', :to => 'films#display_products_by_genre'

post 'seats/display_seats_by_screen', :to => 'seats#display_seats_by_screen'
get 'seats/display_seats_by_screen', :to => 'seats#display_seats_by_screen'

post 'screens/display_screens_by_showing', :to => 'screens#display_screens_by_showing'
get 'screens/display_screens_by_showing', :to => 'screens#display_screens_by_showing'

post 'films/multi_find', :to => 'films#multi_find'
get 'films/multi_find', :to => 'films#multi_find'

post 'seats/multi_find', :to => 'seats#multi_find'
get 'seats/multi_find', :to => 'seats#multi_find'
post 'screens/multi_find', :to => 'screens#multi_find'
get 'screens/multi_find', :to => 'screens#multi_find'


match '*a', to: 'errors#routing', via: [:get, :post]   

有人有什么想法吗?

在 ruby 中,variable@variable 是两个不同的东西,因此在您的 films/show 页面中,您要遍历每个 @film.showings 并且有一个本地 showing 变量(您 do 实际上在循环的第一行中使用)但是在您的 link_to 'Book' 中您使用 @showing 要么有没有值,或值错误(如果您将其设置为控制器中的显示之一)。

修复方法是将 @showing 替换为 showing 局部变量 link_to

首先我们配置路由

resources :films do
  resources :showings
end

然后我们配置控制器

class ShowingController < ApplicationController
  def index
    @showings = Showing.where(film_id: params[:film_id])
  end
end

无需更新视图,应该可以正常工作

确保检查您所有的旧放映路线,您可能需要更新它们,如果您发现修复所有这些路线很麻烦,我们可以在 /showings 下创建所有资源操作并且仅将 :index 移到 films