美文网首页ruby小白课程实战--宠物论坛
【Ruby on Rails实战】4.2 评论功能实现(一)--

【Ruby on Rails实战】4.2 评论功能实现(一)--

作者: 808cb3be8e58 | 来源:发表于2019-01-13 13:12 被阅读1次

    1、详情页面功能描述

    (1)点击帖子标题/帖子内容,进入帖子详情页面,评论框在详情页面最下面。
    (2)点击详情页面的评论按钮,页面定位到评论框。(通过锚点定位)
    (3)点击每个评论下面的回复按钮,在该评论下面出现回复评论框,回复变成取消回复,点击取消回复,收起评论框。用js控制。
    (4)如果评论被删除,评论内容展示为「该评论已删除」,该评论回复按钮隐藏,该评论下面的回复可以正常显示和回复
    (5)每个评论回复的条数最多显示两条,多于两条,回复下面会显示「点击查看更多回复」

    2、创建comments表,来保存评论,表结构如下:

    字段名 字段说明 字段类型 备注
    account_id 用户id integer 必填
    post_id 帖子id integer 必填
    status 评论状态 integer 0代表正常,1代表自己删除,2代表管理员删除
    content 评论内容 text 评论限制200字
    as_type 评论类型 integer 0代表帖子的评论,1代表评论的回复
    re_comment_id 回复评论的id integer 当as_type为1时,此项为此回复所属帖子评论(as_type为0)的id。
    re_reply_id 被回复评论的id integer 当回复as_type为1的评论时,此项为这条as_type为1的评论的id

    字段解析:

    • re_comment_id字段
      设计这个字段是为了获取某个评论(as_type为0的评论)下面的所有回复
    • re_reply_id字段
      设计这个字段是为了找到被回复的as_type为1的评论id,我们通过这个被回复的评论id,找到该条评论,从而找到对应的客户,显示在页面上

    3、执行命令创建comments表

    #产生映射文件
    /vagrant/data_symtem$ rails g model comment account_id:integer post_id:integer status:integer content:text as_type:integer re_post_id:integer re_account_id:integer
    #系统返回信息
       create    db/migrate/20181127085433_create_comments.rb
       create    app/models/comment.rb
       invoke    test_unit
       create      test/models/comment_test.rb
       create      test/fixtures/comments.yml
    #将映射文件映射到数据库中
    /vagrant/data_symtem$ rake db:migrate
    #系统返回信息
    == 20181127085433 CreateComments: migrating ===================================
    -- create_table(:comments)
      -> 0.0150s
    == 20181127085433 CreateComments: migrated (0.0164s) ==========================
    

    4、修改字段名称:

    (1)运行完rake db:migrate之后,突然发现有两个字段名输入错误,re_post_id、re_account_id,分别应为re_comment_id,re_reply_id。这时,需要先在终端运行rails g migration RenameRePostIdForComment
    • RenameRePostIdForComment这个名称不是固定的,ChangeRePostIdForComment和RenameRePostIdToComment都是可以的,但是要保证名称的唯一,并且能通过名称判断你改了哪个表的哪个字段。
    #产生映射文件
    /vagrant/data_system$ rails g migration RenameRePostIdForComment
    #系统返回信息
    Running via Spring preloader in process 4235
    invoke  active_record
    create    db/migrate/20181128074435_rename_re_post_id_for_comment.rb
    
    (2)上面的操作产生了映射文件,db/migrate/20181128074435_rename_re_post_id_for_comment.rb,打开sublime代码编辑器,在db/migrate文件夹下找到这个文件,粘贴下面代码,保存文件
    def change
      rename_column :comments, :re_post_id, :re_comment_id
      rename_column :comments, :re_account_id, :re_reply_id
    end
    
    (3)我们运行rake db:migrate迁移一下修改后的映射文件,将映射文件映射到数据库中。
    /vagrant/data_system$ rake db:migrate
    #系统返回信息
    == 20181128074435 RenameRePostIdForComment: migrating =========================
    -- rename_column(:comments, :re_post_id, :re_comment_id)
       -> 0.0270s
    -- rename_column(:comments, :re_account_id, :re_reply_id)
       -> 0.0271s
    == 20181128074435 RenameRePostIdForComment: migrated (0.0572s) ================
    

    这样re_post_id、re_account_id字段名字,分别被修改为re_comment_id,re_reply_id

    (4)扩展

    A、如果某个字段的类型不小心填错了,比如comments表中的post_id字段的integer类型写成了string类型。首先在命令行运行rails g migration ChangePostIdForComment,产生映射文件后,在映射文件中添加下面代码:

    change_column :comments, :post_id, :string, default: "0"
    

    B、如果某个字段本不需要添加,需要删除这个字段,比如comments表中需要删除掉as_type字段。首先在命令行运行rails g migration DeleteAsTypeForComment,产生映射文件后,在映射文件中添加下面代码:

    remove_column :comments, :as_type
    

    相关文章

      网友评论

        本文标题:【Ruby on Rails实战】4.2 评论功能实现(一)--

        本文链接:https://www.haomeiwen.com/subject/ftbkdqtx.html