为什么在我的 _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'> </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
所以我有一个日历控制器和一个名为 _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'> </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