ホームページ閲覧数を表示させる機能を追加
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 %>