Gem TheComments trong Rails
Chào các bạn, hôm nay mình xin giơí thiệu một gem khá mạnh mẽ trong Rails để tạo chức năng comments. Đầu tiên ta cài đặt những gem cần dùng: mở Gemfile và thêm vào: gem "the_comments", "~> 2.2.1" gem 'haml' # or gem 'slim' gem 'awesome_nested_set' # or same gem Sau đó ...
Chào các bạn, hôm nay mình xin giơí thiệu một gem khá mạnh mẽ trong Rails để tạo chức năng comments.
Đầu tiên ta cài đặt những gem cần dùng: mở Gemfile và thêm vào: gem "the_comments", "~> 2.2.1" gem 'haml' # or gem 'slim' gem 'awesome_nested_set' # or same gem Sau đó chạy bundle install để cài đặt gem Trong bài viết này mình sữ dụng gem the_comments cho bài post, và mình sẽ có model Post và User Chạy lệnh sau để tạo các bảng cần thiết: rake the_comments_engine:install:migratio Nó sẽ tạo ra cho mình 3 file trong db/migrate có tên là 20170122033608_the_comments_change_user.the_comments_engine.rb 20170122033609_the_comments_create_comments.the_comments_engine.rb 20170122033610_the_comments_change_commentable.the_comments_engine.rb Tiếp theo ta mở file 20170122033610_the_comments_change_commentable.the_comments_engine.rb và thêm vào như sau: class ChangeCommentable < ActiveRecord::Migration def change [:posts].each do |table_name| change_table table_name do |t| t.integer :draft_comments_count, default: 0 t.integer :published_comments_count, default: 0 t.integer :deleted_comments_count, default: 0 end end end end Tiếp theo mở file 20170122033608_the_comments_change_user.the_comments_engine.rb, bạn sẽ thấy rằng nó đã đươc thêm tự động vào users class TheCommentsChangeUser < ActiveRecord::Migration def change #if you User class is not called User, you may want to change it. change_table :users do |t|
t.integer :my_draft_comments_count, default: 0 t.integer :my_published_comments_count, default: 0 t.integer :my_comments_count, default: 0 # my_draft_comments_count + my_published_comments_count t.integer :draft_comcoms_count, default: 0 t.integer :published_comcoms_count, default: 0 t.integer :deleted_comcoms_count, default: 0 t.integer :spam_comcoms_count, default: 0 end end
end Tiếp theo chạy lệnh sau để cập nhật lại dữ liệu: rake db:migrate Bây giờ mình sẽ tạo file controller cho comments và những config cần thiết, bạn chạy lệnh sau: rails g the_comments install Nó sẽ tạo ra 3 file là: config/initializers/the_comments.rb app/controllers/comments_controller.rb app/models/comment.rb Tiếp theo mình mở file app/models/user.rb và thêm vào class User < ActiveRecord::Base include TheComments::User
has_many :posts def admin? self == User.first end def comments_admin? admin? end def comments_moderator? comment id == comment.holder_id end
end Trong app/models/post.rb class Post < ActiveRecord::Base include TheComments::Commentable
belongs_to :user def commentable_title "Undefined Post Title" end def commentable_url "#" end def commentable_state "published" end end
Thêm vào routes file config/routes.rb MyApp::Application.routes.draw do root 'posts#index' resources :posts concern :user_comments, TheComments::UserRoutes.new concern :admin_comments, TheComments::AdminRoutes.new resources :comments, concerns: [:user_comments, :admin_comments] end Thêm đến app/controllers/application_controller.rb class ApplicationController < ActionController::Base include TheComments::ViewToken protect_from_forgery with: :exception end Thêm vào app/assets/stylesheets/application.css /* *= require the_comments */ Thêm vào app/assets/javascripts/application.js //= require the_comments Ví dụ code ở controller def show @post = Post.find params[:id] @comments = @post.comments.with_state([:draft, :published]) end Vi dụ code ở trang view app/views/posts/show.html.erb <%= render partial: 'the_comments/tree', locals: { commentable: @post, comments_tree: @comments }%>
Như vậy là mình đã hoàn thành xong chức năng comment cho bài post. Cảm ơn các bạn đã theo dõi. Link tham khảo: https://github.com/the-teacher/the_comments