Rails如何展示已登录用户关联数据 已登录用户任务不显示怎么解决
问题原因
- ERB输出语法错误:你使用的
<% %>是Rails ERB的执行语句标签,仅执行内部Ruby代码不会把结果输出到HTML页面,要输出内容必须使用带等号的<%= %>标签。 - 控制器查询逻辑错误:
Task.find_by_user_id只会返回单条Task记录,如果用户关联了多个任务,只能拿到第一条,不符合「所有任务」的需求。- 控制器判断登录用的是
current_user,查询时却用了@current_user,如果使用Devise等常用用户认证gem,默认当前用户变量是无@前缀的current_user,如果没有手动给@current_user赋值,这里会拿到空值,导致查询失败。
- 模板路径/命名不匹配:控制器中指定渲染的模板是
task/allTask,但你给出的模板名为task.erb,路径不匹配会导致模板找不到或者渲染错误。 - 缺少多任务遍历逻辑:如果要展示多个任务,直接调用
@all_task.字段名会报错,需要遍历任务集合才能输出每条任务的属性。
修复方案
1. 修正控制器代码
修改app/controllers/task_controller.rb内容:
class TaskController < ApplicationController def all_task if current_user.present? # 直接通过关联查询当前用户的所有任务,更符合Rails规范 @all_tasks = current_user.tasks # 若未设置模型关联,也可以用where查询:@all_tasks = Task.where(user_id: current_user.id) render template: 'task/all_task' end end end
前置要求:先确认User模型已添加has_many :tasks、Task模型已添加belongs_to :user的关联配置。
2. 修正模板命名和代码
将模板文件重命名为app/views/task/all_task.html.erb,修改代码如下:
<p>All Task</p> <% if user_signed_in? %> <% @all_tasks.each do |task| %> <div> <p>任务内容:<%= task.daily_task %></p> <p>任务日期:<%= task.date %></p> <p>创建时间:<%= task.created_at %></p> </div> <% end %> <% end %>
如果你确定每个用户只有一条关联任务,不需要遍历的话,直接把原模板的<% %>替换为<%= %>即可,不需要加each循环。
3. 路由确认
你现有路由配置可以正常使用,也可改为更符合REST规范的写法:
resources :tasks, only: [] do collection do get :all_task end end
内容的提问来源于stack exchange,提问作者smith
相关产品推荐
相关产品推荐

