2015-02-20 4 views
0

В моем приложении Ruby on Rails я пытаюсь отобразить три раскрывающихся меню в файле _form.html.erb, которые отображаются из файла _booking_lookup.html.erb и получают там данные из методов выпадающего меню в моделях.Почему я получаю ошибку `undefined method 'map'`?

_form.html.erb:

<%= render(:partial => '/booking_lookup', :locals=> {:film => @film = Film.all, :showings => @showings = Showing.all, :seats => @seats = Seat.all, :my_path => '/films/booking_lookup' }) %> 

_booking_lookup.html.erb:

<%= form_tag my_path, :method=>'post', :multipart => true do %> 
<%= select_tag ('title_id'), 
    options_from_collection_for_select(@films, :id, :title_info, 0), 
    :prompt => "Film" %> 

<%= select_tag ('showings_id'), 
    options_from_collection_for_select(@showings, :id, :showing_times, 0), 
    :prompt => "Showings" %> 

<%= select_tag ('seat_id'), 
    options_from_collection_for_select(@seats, :id, :seats_available, 0), 
    :prompt => "Seats" %> 

<%= submit_tag 'Search' %> 

film.rb:

class Film < ActiveRecord::Base 

has_many :showings 
belongs_to :certificate 
belongs_to :category 

def title_info 
    "#{title}" 
end 
end 

seat.rb:

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

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

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 

Но по какой-то причине с линией: <%= select_tag ('title_id'), options_from_collection_for_select(@films, :id, :title_info, 0), :prompt => "Film" %> я получаю ошибку:

NoMethodError in Bookings#new 
undefined method `map' for nil:NilClass 

Странная часть является то, что я использую много этого кода еще где, у меня есть форма _multi_search.html.erb:

<%= form_tag my_path, :method=>'post', :multipart => true do %> 
<!-- Genre: --> 
Search By: 
<%= select_tag ('cat_id'), 
    options_from_collection_for_select(@categories, :id, :category_info, 0), 
    :prompt => "Genre" %> 

<%= select_tag ('cert_id'), 
    options_from_collection_for_select(@certificates, :id, :certificate_info, 0), 
    :prompt => "Age Rating" %> 

<%= text_field_tag :search_string, nil, placeholder: "ACTOR" %> 
or 
<%= select_tag ('title_id'), 
    options_from_collection_for_select(@films, :id, :title_info, 0), 
    :prompt => "Film" %> 
<%= submit_tag 'Search' %> 
<% end %> 

и используется в application.html.erb:

<%= render(:partial => '/multi_search', :locals=> {:categories => @categories = existing_genres, :certificates => @certificates = Certificate.all, :films => @films = Film.all, :my_path => '/films/multi_find' }) %>

И это прекрасно работает.

Что я делаю неправильно?

+0

Вы проверили, если @ фильмы ноль? – Laerte

+0

Нет, я этого не сделал, но я уверен, что это не ноль. Странно, что у меня есть что-то похожее, работающее где-то там, где это работает, - я включу это в исходный вопрос. –

+0

'@ films' ** ** ** - вы устанавливаете' @film = Film.all', а не '@films = Film.all'. – alephtwo

ответ

3

Похоже, @films - это нуль. Попробуйте установить @films = Film.all (вместо @film = Film.all) в _form.html.erb.

Update:

Я рекомендовал бы двигаться запросы к действию контроллера. В шаблоне Model-View-Controller контроллеры должны задавать модели для данных, а не Views.

# BookingLookupController 
def new 
    @films = Film.all 
    @showings = Showing.all 
    @seats = Seat.all 
end 

Затем вы можете ссылаться на переменные экземпляра в представлении.

<%= render partial: '/booking_lookup', locals: {films: @films, showings: @showings, seats: @seats, my_path: '/films/booking_lookup' } %> 
+0

Не могу поверить, что я совершил эту ошибку. Спасибо! –

+0

Выберите свой ответ правильно, чтобы поблагодарить его! – Laerte

+1

Иногда это просто занимает 2-ю пару глаз. =) – messanjah

0

В контроллере выберите поля, как вы просто хотите, чтобы отобразить имена в раскрывающемся списке

def method_name 
    @films = Film.select([:id, :title_info]) 
    @showings = Showing.select([:id, :showing_times]) 
    @seats = Seat.select([:id, :seats_available]) 
end 

В странице

<%= render(:partial => '/booking_lookup', :locals=> {:films => @films, :showings => @showings, :seats => @seats, :my_path => '/films/booking_lookup' }) %> 

При частичном

options_from_collection_for_select(films, :id, :title_info, 0),:prompt => "Film" %> 
+0

Пожалуйста, используйте контроллеры для связи с Модели. Никогда не пытайтесь использовать этот тип вызова метода активной записи из представления, это очень плохая практика. –

Смежные вопросы