防止轨道4上的nil变量的最佳方法

时间:2013-10-13 03:22:00

标签: ruby-on-rails

我有一个查询,检查数据库中是否存在某些值,如果存在则返回一个数组

@canEditTask = Accessor.where("accessor_id = ? AND access_right = ?", current_user, true)

问题是这可以返回零         @taskEdit = @canEditTask

但我的html中的每个方法仍然失败,因为nil {nil undefined method nil:NilClass`

<% @taskEdit.each do |task| %>
      <%= task.id %>

在这种情况下,防止nil破坏我的代码的最佳方法是什么?

编辑 控制器代码

  def index
    @canEditTasks = Accessor.where("accessor_id = ? AND access_right = ?", current_user, true)
  end

  def show
     @taskEdit = @canEditTasks
     rescue ActiveRecord::RecordNotFound
       render :file => 'public/404.html'
  end

查看代码

<div>
  <% @taskEdit.each do |task| %>
      <%= task.id %>
  <% end %>
</div>

3 个答案:

答案 0 :(得分:3)

您在索引方法中设置@canEditTasks并尝试在show方法中使用它...如果您对此感到困惑,您可能应该回到基础并阅读/观看一些Rails教程(抱歉)如果我在这里遗漏了什么......)。

答案 1 :(得分:2)

@taskEdit = @canEditTasks操作中指定show时,@canEditTasks为零,这意味着@taskEdit也为零。

一次运行一个操作,似乎您的代码期望index先运行,然后show将在此之后运行。这不是Rails默认的工作方式。如果您想运行一些在多个操作之间共享的代码,我建议使用before_filter

before_filter :set_can_edit_tasks

def index; end

def show
  @taskEdit = @canEditTasks
  rescue ActiveRecord::RecordNotFound
    render :file => 'public/404.html'
end

private

def set_can_edit_tasks
  @canEditTasks = Accessor.where("accessor_id = ? AND access_right = ?", current_user, true)
end

答案 2 :(得分:0)

我更喜欢在活动记录之后使用.to_a。因此,当nil数组循环时没有错误;)避免视图中的条件。