为什么在我的 _show.html 文件中无法识别变量?

Why isn't a variable recognised within my _show.html file?

所以我有一个日历控制器和一个名为 _show.html.erb 的视图(它是加载到更大视图中的部分视图)。我正在尝试使用属于 'event' 模型对象的属性 'starts_at',但我的 html 突出显示它说 "cannot find starts_at".

如果我尝试加载我的主页,它会给出错误:

页面中没有方法错误#main

nil:NilClass

的未定义方法“each”

这是我的显示方法的日历控制器:

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 属性是日期时间类型。当我学习如何在 rails 上执行 ruby 时(诚然不久前)我被告知这种 ruby 注入会起作用。这里有什么问题?谢谢!

您需要验证用户是否存在,这样应该可以工作:

#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

这样,如果没有用户登录,它将 return 一个 "events" 的空数组。您可以轻松地将数组替换为 scope 个实际事件,例如:

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