描述:每个用户(user)都可以发博客(issue),不同的用户可以对一个博客做出评论(comment)
数据模型之间的关系
用户与博客之间是1对多关系,一个用户可以发多个博客,一个博客只属于一个用户
博客与评论之间是1对多关系,一个博客底下可以有多条评论,一条评论只能属于一个博客
用户与评论之间是1对多关系,一个用户可以发表多条评论,一条评论只能属于一个用户
完整的数据模型关系如下:
添加如上关系模型的作用:
has_many :comments
然后到 comment.rb 中添加
belongs_to :user
这样就可以使用 @comment.user.name 这样的语法了。
最终的表结构
控制器代码讲解
(1)用户控制器中都是登陆退出注册这样的代码,跟发布博客和评论一点关系没有
(2)博客控制器
(3)评论控制器
注意:一条博客可以被不同的用户评论,我们需要能够知道评论的发起人的信息,错误的办法就是给评论模型添加用户名和邮箱字段。正确的方式应该是:
用户名和邮箱这些字段已经存在用户模型之中了,我们不需要再重复定义,只要评论模型和用户模型通过user_id字段关联起来即可。而且这样做的好处是登陆会保存当前用户,所以我们发表评论时自动是当前登录用户进行发表评论。
视图代码注意事项
我们在发表评论时,实际完成评论保存到数据库中的动作代码是:
可以看到要提交上面那三个字段,但是我们的视图表单中应该只显示评论的输入框就可以了
issue_id和user_id字段不应该在视图页面手动输入,而是应该不显示这些输入框,但是点击提交还是能把这些字段的值提交给服务器。
做法如下:
必须在form_for里面添加需要提交的字段名称,而对于不需要在视图中显示但又必须提交给服务器的字段我们使用hidden_field。
issue_id和user_id字段应该是自动关联的才对,因为视图里面对这些隐藏字段无法输入值,所以我们先在new里面给需要提交的字段进行赋值,然后点击提交就会将隐藏字段和输入字段的值一起进行提交。