博客评论系统表单数据无法存入数据库的问题求助
看起来你遇到的核心问题是模型层的属性定义错误,另外表单构建方式也有小问题,我帮你一步步拆解:
1. 最关键的问题:attr_accessor :content 覆盖了数据库字段存取方法
你的Comment模型里写了attr_accessor :content,这会在内存中创建一个虚拟属性,直接覆盖了Rails自动为数据库content字段生成的getter/setter方法。也就是说,虽然你从表单拿到了content的值,但这个值只是存在内存里的虚拟属性中,根本没被写入数据库的对应字段。
2. 表单的小坑:@wad.comments.create会提前创建空记录
你表单里用@wad.comments.create的话,页面渲染的时候就会往数据库里插入一条空的评论记录,这显然不是你想要的。应该用build方法来构建一个未保存的内存对象,只有提交表单时才会真正创建记录。
修复步骤
第一步:移除模型中的attr_accessor :content
修改你的Comment模型:
class Comment < ApplicationRecord # 删掉这一行:attr_accessor :content belongs_to :wad belongs_to :user end
另外请确认你的数据库comments表确实存在content字段,可以查看对应的迁移文件:
# 迁移文件应该类似这样 class CreateComments < ActiveRecord::Migration[7.0] def change create_table :comments do |t| t.text :content t.references :wad, null: false, foreign_key: true t.references :user, null: false, foreign_key: true t.timestamps end end end
如果没有content字段,需要生成迁移添加:
rails generate migration AddContentToComments content:text rails db:migrate
第二步:修正表单的评论对象构建方式
把表单里的@wad.comments.create换成@wad.comments.build:
<%= form_for([@wad, @wad.comments.build]) do |f| %> <%= f.text_area :content %> <%= f.submit %> <% end %>
build只会在内存中创建新对象,不会提前写入数据库,只有提交表单后控制器的create方法才会保存这条记录。
第三步:补全用户关联(可选但必要)
你的Comment模型关联了user,但当前控制器没有设置评论的user_id,如果数据库里user_id是必填项,保存时会失败。建议在创建评论时关联当前登录用户:
def create @comment = @wad.comments.build(comment_params) @comment.user = current_user # 假设你用了Devise等身份验证,current_user是当前登录用户 if @comment.save flash[:success] = "Thanks for posting!" # 注意你这里拼写错了:sucess → success redirect_to wad_comments_path(@wad) else flash[:error] = "Failed submission. Please try again." render 'index' end end
顺便提一下,你控制器里的flash[:sucess]拼写错误,改成flash[:success]才能正确显示提示信息。
修复完成后重启服务器,提交评论后查看数据库,content字段应该就能正常存入数据了。
内容的提问来源于stack exchange,提问作者iThompkins

