【发布时间】:2015-08-01 20:13:50
【问题描述】:
我正在开发一个待办事项列表应用程序,我所做的一切都是从第 10 章开始的,并且我一直在使用第 11 章的部分内容,我需要做到这一点。我已经在网站的其他部分完成了我正在尝试做的事情,只有制作待办事项列表的用户才能看到按钮,并且正确的用户待办事项位于个人资料页面上,但由于某种原因我不能似乎与静态页面控制器的主页操作相同。基本上,除了主页上显示的正确用户待办事项列表外,它已完成 99%,具体取决于您是否已登录,如果您未登录,您会看到其他内容。
整个home.html.erb
<% if logged_in? && current_user?(@todo_list.user) %>
<div class="container">
<div class="row">
<% @todo_lists.each do |todo_list| %>
<div class="col-md-8 col-md-offset-2">
<div class="well">
<p class="todo_list_title"><%= link_to todo_list.title, todo_list %></p>
<p class="todo_list_description"><%= todo_list.description %>
| <%= link_to "Show", todo_list_path(todo_list) %>
| <%= link_to "Edit", edit_todo_list_path(todo_list) %>
| <%= link_to 'Delete', todo_list, method: :delete, data: { confirm: 'Are you sure?' } %>
</p>
</div>
</div>
<% end %>
<div class="col-md-8 col-md-offset-2">
<%= link_to "New Todo List", new_todo_list_path,
class: "btn btn-lg btn-primary" %>
</div>
</div>
</div>
<% else %>
<div class="center jumbotron">
<h1>Todo List App</h1>
<%= link_to "Sign up now!", signup_path, class: "btn btn-lg btn-primary" %>
</div>
<% end %>
static_pages_controller.rb
使用像这样的 static_pages_controller 主页操作
def home
@todo_lists = TodoList.all
end
以下是 home.html.erb 及其给出的结果的组合
<% if logged_in? %>
这显示了所有用户的待办事项列表
<% if logged_in? && current_user?(@todo_list) %>
这会捕获 else 语句
<% if logged_in? && current_user?(@todo_list.user) %>
nil:NilClass 的未定义方法“用户”
用static_pages_controller这样
def home
@user = User.find(params[:id])
@todo_lists = TodoList.all
end
或者像这样……
class StaticPagesController < ApplicationController
before_action :logged_in_user
before_action :correct_user
def home
@user = User.find(correct_user)
@todo_lists = @user.todo_lists.paginate(page: params[:page])
end
private
def logged_in_user
unless logged_in?
store_location
flash[:danger] = "Please log in."
redirect_to login_url
end
end
def correct_user
@user = User.find(params[:id])
redirect_to(root_url) unless current_user?(@user)
end
end
以上三个例子都给出了这个错误
找不到具有 'id'=的用户
似乎logged_in_user 和private 下的correct_user 方法的任何组合都不起作用,我似乎总是遇到上述错误之一,当我让用户配置文件正常工作时,这有点令人沮丧正确的用户已登录。
我确信答案很简单,就像它似乎总是那样,但我看不到它
问候 肖恩
更新
# Returns true if the given user is the current user.
def current_user?(user)
user == current_user
end
# Define the method current_user
def current_user
# Returns the current logged-in user (if any).
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(:remember, cookies[:remember_token])
log_in user
@current_user = user
end
end
end
【问题讨论】:
-
此变量
@todo_list为零,而您正在尝试执行@todo_list.user导致此错误undefined method user for nil:NilClass以及为什么@todo_list在家庭操作中为零。你没有在@todo_list中设置任何东西 -
这行不是在做什么吗?...@todo_lists = @user.todo_lists.paginate(page: params[:page])
-
所以
@todo_lists = @user.todo_lists.paginate(page: params[:page])这一行将用户的待办事项列表设置在@todo_lists对象中,这是一个数组。这条线<% if logged_in? && current_user?(@todo_list.user) %>试图从@todo_list获取用户,你看到s丢失了。其次,您无法从 @todo_lists 数组中找到用户 -
那么我将如何找到用户?那是我想不通的地方
-
@user 和当前用户有什么区别。其次,你能分享一下这个
current_user?方法的代码吗?
标签: ruby-on-rails ruby-on-rails-4 railstutorial.org