0
0

More than 1 year has passed since last update.

【Ruby on rails】 記事閲覧数を表示させる

Posted at

ホームページ閲覧数を表示させる機能を追加

ruby 2.6.3p62
rails 5.2.6

1.新規実行内容

Gemfileに以下を追記

gem 'impressionist', '~>1.6.1'

railsバージョンとimpressionistバージョンによっては
エラーが発生するので注意

bundle install
rails g impressionist

impressionistテーブルを作ると以下が自動で作成されますが
使うのは1カラム(session_hash)である

create_impressions_table.rb
class CreateImpressionsTable < ActiveRecord::Migration[5.2]
  def self.up
    create_table :impressions, :force => true do |t|
      t.string :impressionable_type
      t.integer :impressionable_id
      t.integer :user_id
      t.string :controller_name
      t.string :action_name
      t.string :view_name
      t.string :request_hash
      t.string :ip_address
      t.string :session_hash
      t.text :message
      t.text :referrer
      t.text :params
      t.timestamps
    end
    add_index :impressions, [:impressionable_type, :message, :impressionable_id], :name => "impressionable_type_message_index", :unique => false, :length => {:message => 255 }
    add_index :impressions, [:impressionable_type, :impressionable_id, :request_hash], :name => "poly_request_index", :unique => false
    add_index :impressions, [:impressionable_type, :impressionable_id, :ip_address], :name => "poly_ip_index", :unique => false
    add_index :impressions, [:impressionable_type, :impressionable_id, :session_hash], :name => "poly_session_index", :unique => false
    add_index :impressions, [:controller_name,:action_name,:request_hash], :name => "controlleraction_request_index", :unique => false
    add_index :impressions, [:controller_name,:action_name,:ip_address], :name => "controlleraction_ip_index", :unique => false
    add_index :impressions, [:controller_name,:action_name,:session_hash], :name => "controlleraction_session_index", :unique => false
    add_index :impressions, [:impressionable_type, :impressionable_id, :params], :name => "poly_params_request_index", :unique => false, :length => {:params => 255 }
    add_index :impressions, :user_id
  end

  def self.down
    drop_table :impressions
  end
end
rails db:migrate

2.既存ファイルへ追加

閲覧数を表示させたい、viewファイルのモデルに追記する。

post.rb
class Post < ApplicationRecord

  is_impressionable # 閲覧数確認のため追加

end

「app/views/posts/show.html.erb」に表示させたいため
以下のような記載を追記

app/controllers/posts.controller.rb
class PostsController < ApplicationController

  impressionist actions: [:show] # showアクションで閲覧数確認のため追加

 def show
    @post = Post.find(params[:id])
    impressionist(@post, nil, unique: [:session_hash.to_s])  # 閲覧数確認のため追加
 end

....

end

コントローラファイルへの追記部分二か所についてですが

①「impressionist :actions=> [:show]」という書き方でも大丈夫ですが、
 静的コード解析ツールのrubocop実行時に文法的にお叱りを受けてしまいました。
②.to_sメソッドをつけない場合は
「TypeError can't quote Rack::Session::SessionId」エラーが発生してしまったので
文字列に変換させましょう

最後にviewファイルに以下のような追記をすれば、閲覧数を表示させることができます。

app/views/posts/show.html.erb
<%= @post.impressionist_count %>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0