2015-12-18 3 views
0

Итак, у меня есть контроллер календаря и вид, называемый _show.html.erb (это частичный, который загружается в больший вид). Я пытаюсь использовать атрибут «start_at», который принадлежит объекту модели «событие», но мой html подчеркивает, что он «не может найти start_at».Почему переменная не распознана в моем файле _show.html?

Если я пытаюсь и загрузить свою главную страницу дает ошибку:

NoMethodError в Pages # основной

не определен метод `каждый» для ноль: NilClass

Вот календарь контроллер с моим показать метод:

class CalendarsController < ApplicationController 

    def new 
    @calendar = Calendar.new(calendar_params) 

    end 

    def create 
    @calendar = Calendar.new(calendar_params) 
    end 

private 
    def calendar_params 
    params.require(:customer_id) 
    end 


    def show 
    @calendar = current_customer.calendar 
    @events = @calendar.events 

    end 

end 

Мои события контроллер:

class EventsController < ApplicationController 
    before_filter :logged_in? 


    def new 
    @event = Event.new 
    @calendar = current_customer.calendar 

    end 


    def create 

    @calendar = current_customer.calendar 

    @event = @calendar.events.build(event_params) 

    if @event.save 
     redirect_to '/main' #'/main/#{@calendar.id}' 
    else 
     redirect_to '/compose' 
     end 

    end 

Вот _show.html.erb сниппет:

<td id = "mon900" class ="freeslot" width=75 valign=top> 
     <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height: 
       normal'>&nbsp;</p> 
     <% @events.each do |e|%> 
     <p><%= e.starts_at %></p> <!-- It wont pick up starts_at--> 
     <% end %> 
</td> 

Вот код, где я рендеринга это частичное. Он визуализируется в main.html.erb, которая принадлежит мой контроллеру Страницы:

<%= render partial: '/calendars/show', locals: {} %> 

Страница контроллер:

class PagesController < ApplicationController 

    #before_action :require_customer, only: [:main] 

    def home 

    end 


    def main 

    end 

end 

Просто для ясности, здесь мой календарь и событие модели:

class Calendar < ActiveRecord::Base 
    belongs_to :customer 
    has_many :events 
end 

class Event < ActiveRecord::Base 
    belongs_to :calendar 

end 

Атрибут: starts_at события имеет тип даты и времени. Когда я узнал, как делать рубины на рельсах (по общему признанию, недавно), мне сказали, что такая рубиновая инъекция будет работать. В чем проблема? Благодаря!

+0

Что вы имеете в виду это обыкновение забрать? Вы получаете нулевое значение? ошибка? – Pavan

+0

он подсвечивает его, говоря «can not find starts_at» – Sarahshuffle

+0

Обновите свой вопрос с полным сообщением об ошибке. – Pavan

ответ

0

Вам потребуется некоторое подтверждение, что пользователь существует, так что-то, как это должно работать:

#controllers/pages 
def main 
    @events = current_user ? current_user.calendar.events : [] 
end 

Разъяснение; это выше тройная операция выписала:

if current_user 
    @events = current_user.calendar.events 
else 
    @events = [] # an empty array, which will address "undefined method `each' for nil:NilClass" 
end 

Таким образом, если не регистрируются в нем будет возвращать пустой массив «событий» пользователя. Вы можете так же легко заменить массив с scope реальных событий, таких как:

@events = current_user ? current_user.calendar.events : Event.all 
+0

хорошо, не могли бы вы объяснить мне, что означает «: []» в конце? – Sarahshuffle

+0

уверенная вещь @Sarahshuffle, я отредактировал ответ, чтобы уточнить. – kjmagic13

+0

большое спасибо! – Sarahshuffle