0

特定の値がDBに存在するかどうかを確認し、存在する場合は配列を返すクエリがあります

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

問題は、これが nil @taskEdit = @canEditTask を返す可能性があることです

しかし、私のhtmlの each メソッドは、 nil undefined methodeach' for 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>
4

3 に答える 3

3

index メソッドで設定@canEditTasksし、それを show メソッドで使用しようとしています...これに混乱している場合は、おそらく基本に戻って、Rails チュートリアルを読んだり見たりする必要があります (ここに何かが欠けている場合は申し訳ありません. ..)。

于 2013-10-13T03:38:54.437 に答える
2

アクションで代入@taskEdit = @canEditTasksすると is nil になります。これは is nil も意味します。show@canEditTasks@taskEdit

アクションは一度に 1 つずつ実行されます。コードは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
于 2013-10-13T03:42:41.613 に答える
0

アクティブなレコードの後に​​ .to_a を使用したいと思います。したがって、nil 配列がループされてもエラーは発生しません ;) ビュー内の条件を回避します。

于 2013-10-13T05:10:38.510 に答える