每个语句都不能遍历current_user.id

时间:2014-07-27 10:09:03

标签: ruby-on-rails ruby authentication devise

我试图列出当前登录用户的待办事项列表。我使用devise作为我的身份验证宝石。

代码如下:

class TodosController < ApplicationController
  def index
    if user_signed_in?
      @todo_items = Todo.all.find_by_user_id(current_user.id)
      @new_todo = Todo.new
    else 
      redirect_to new_user_session_path
    end
  end
end

但是当我运行这个时我得到了这个错误

undefined method `each' for #<Todo:0x38b8d68>

我的迭代声明是:

<div class="well">
  <% @todo_items.each do |t| %> **#error in this line.**
    <li> <%= t.todo_item %> </li>
  <% end %>
</div>

我不知道自己做错了什么。 我也试过

@todo_items = Todo.all.find_by_user_id(params[:current_user.id])

我仍然得到同样的错误。 我现在相当新,并且现在没有使用任何教程,所以请尝试从新手的角度解释你的答案。感谢

3 个答案:

答案 0 :(得分:0)

find_by_user_id(...)where(:user_id => ...).first相同,只返回一个项目。您可能想要使用:

Todo.where(:user_id => current_user.id)

什么返回一个数组(并响应each)。甚至更好:如果我们的用户模型与has_manytodos关联,请写:

current_user.todos

答案 1 :(得分:0)

您的代码看起来像

 class TodosController < ApplicationController
   def index
    if user_signed_in?
     @todo_items = Todo.where(user_id: current_user.id)
     @new_todo = Todo.new
    else 
     redirect_to new_user_session_path
    end
   end
  end

然后

  <div class="well">
   <% @todo_items.each do |t| %> **#error in this line.**
   <li> <%= t.todo_item %> </li>
   <% end %>
  </div>

答案 2 :(得分:0)

当您运行此

Todo.all.find_by_user_id(current_user.id)

首先,

Todo.all will return all the user records

你在Todo.all上应用了find_by_user_id,因为我们知道find_by方法返回单个记录

显然,

Todo.all.find_by_user_id

将返回单个记录,因为您正在从所有用户中找到单个用户。

并且您正在尝试迭代导致错误的单个记录。

<% @todo_items.each do |t| %> **#error in this line.**
 <li> <%= t.todo_item %> </li>
<% end %>

以不同的方式尝试,

Todo.find_all_by_user_id(current_user.id)
    (or)
Todo.where(:user_id => current_user.id)
    (or)
Todo.all(:where => "user_id => #{current_user.id}")

以上任何一种都可以。