为什么我的_show.html文件中没有识别变量?

时间:2015-12-18 16:51:58

标签: html ruby-on-rails ruby code-injection

所以我有一个日历控制器和一个名为_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'>&nbsp;</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类型。当我学习如何在铁轨上做红宝石时(不久前不久)我被告知这种红宝石注射会起作用。这里有什么问题?谢谢!

1 个答案:

答案 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