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

时间:2015-02-22 18:54:00

标签: ruby-on-rails ruby variables views

这可能是一个相当基本的问题,但我对Ruby on Rails相当新。

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

在电影/节目页面上,用户可以选择“预订”电影的座位,当他们这样做时,我希望他们进入放映/索引页面,在那里他们可以选择该电影的放映。我遇到的问题是让showings / index页面只显示该电影的放映,因为目前它只列出了数据库中的所有放映。

这是电影/节目页面,其中列出了放映,我正试图传递电影数据:

<% 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]   

有人有什么想法吗?

2 个答案:

答案 0 :(得分:1)

首先我们配置路由

resources :films do
  resources :showings
end

然后我们配置控制器

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

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

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

下的films

答案 1 :(得分:0)

在ruby中,variable@variable是两个不同的东西,所以在films/show页面中,您在每个@film.showings上进行迭代,并且有一个本地showing变量(你实际上在你的循环的第一行使用了)但在你的link_to 'Book'中使用了@showing,它没有任何值,或者具有错误的值(如果你把它设置为控制器中的一个放映。)

修复方法是将@showing替换为showing

中的link_to局部变量