所以我有一个日历控制器和一个名为_show.html.erb的视图(它是一个加载到更大视图中的部分)。我正在尝试使用属于'event'模型对象的属性'starts_at',但我的html突出显示它“无法找到starts_at”。
如果我尝试加载主页,则会出错:
页面#main
中的NoMethodError未定义的方法`each'代表nil:NilClass
以下是带有show方法的日历控制器:
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'> </p>
<% @events.each do |e|%>
<p><%= e.starts_at %></p> <!-- It wont pick up starts_at-->
<% end %>
</td>
这是我渲染此部分的代码。它在main.html.erb中呈现,它属于我的Pages控制器:
<%= 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属性是datetime类型。当我学习如何在铁轨上做红宝石时(不久前不久)我被告知这种红宝石注射会起作用。这里有什么问题?谢谢!
答案 0 :(得分: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