我试图列出当前登录用户的待办事项列表。我使用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])
我仍然得到同样的错误。 我现在相当新,并且现在没有使用任何教程,所以请尝试从新手的角度解释你的答案。感谢
答案 0 :(得分:0)
find_by_user_id(...)
与where(:user_id => ...).first
相同,只返回一个项目。您可能想要使用:
Todo.where(:user_id => current_user.id)
什么返回一个数组(并响应each
)。甚至更好:如果我们的用户模型与has_many
有todos
关联,请写:
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}")
以上任何一种都可以。