Ruby on Rails提交任务数据路由报错、表单提交后数据不入库问题求解
问题根源与修复方案
1. 表单路径配置错误
你表单里写的task_path是单个任务详情路由,必须传入任务id参数,新建场景下没有id所以直接触发missing required keys报错。
修改new.html.erb的表单代码:
<h3>add task</h3> <%= form_for @task do |f| %> Add task: <%=f.text_field :daily_task %><br> date: <%=f.datetime_select :date %> <%= f.submit "Add" %> <% end %>
直接用你在new动作里初始化的@task实例变量,Rails会自动识别是新建对象,将表单提交到对应create动作的路由,不需要手动写url参数。
2. 路由与控制器命名不符合Rails规范
你当前控制器是单数TaskController,Rails默认资源路由对应复数控制器,先修改两个配置:
- 把控制器文件名从
task_controller.rb改成tasks_controller.rb - 控制器类名修改为:
class TasksController < ApplicationController # 原有逻辑不变 end
- 确保
config/routes.rb里配置了resources :tasks
3. 强参数与关联用户逻辑错误
你原有create动作里的参数写法完全不符合规范,且不能从前端参数里获取当前用户id,存在安全漏洞,修改create动作代码:
def create # 正确的强参数写法,先require顶层key,再permit允许的字段 @task = Task.new(params.require(:task).permit(:daily_task, :date)) # 直接赋值当前用户,不要从参数传 @task.users_id = current_user.id # 如果你后续把外键改成符合惯例的user_id,这里就写@task.user = current_user respond_to do |format| if @task.save format.html { redirect_to @task, notice: 'Task added' } else format.html { render :new } end end end
4. 可选优化(符合Rails惯例)
你数据库里的外键字段是users_id,不符合Rails默认的user_id命名规则,后续会产生很多额外配置成本,建议修改字段:
生成迁移文件执行修改:rails g migration ChangeUsersIdToUserIdOnTasks
迁移文件内容:
def change rename_column :tasks, :users_id, :user_id end
执行rails db:migrate后,在Task模型里加belongs_to :user,User模型里加has_many :tasks,后续操作关联会更简便。
内容的提问来源于stack exchange,提问作者smith
相关产品推荐
相关产品推荐

