Rails関連のことを調べてみた2021年12月01日

Rails関連のことを調べてみた2021年12月01日

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

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

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 :impress

元記事を表示

[Rails]Chartkick×Chart.jsで面グラフ(Area chart)を作成する

# はじめに
面グラフとは、
折れ線グラフを塗りつぶしたグラフです。こんなグラフ。
![面グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882861/5973dbe8-0337-688f-6fa3-dee39465802d.png)

Railsでグラフを表示するには Chartkick がとても便利。
デザインが綺麗で扱いやすい Chart.js と組み合わせてグラフを作っていきます。

# 環境
Rails 6.1.3
Ruby 2.7.2

# インストール 
“`ruby:Gemfile
gem “chartkick”
“`
“`console:ターミナル
bundle install
yarn add chartkick chart.js
“`
“`js:app/javascript/packs/application.js
import “chartkick/chart.js”
“`
これで導入は完了です。

# 実装
## 1. データの準備
“`ruby:mode

元記事を表示

I18nを使いながらPCでもスマホでも狙ったところでレスポンシブに改行する

## やりたいこと
Railsでガチでフランス語のアプリを個人開発しています。:fr:

タイトルや文章をブラウザで表示したいとき、PCブラウザは横に長いから改行は要らないが、スマホブラウザでは改行を入れないと見栄えが悪いってことあると思います。しかもお任せしちゃうと「いや、そこで改行しないで…、ダサい!」ってところで改行してくれてしまいます。

こんな感じで↓

![minnfra.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645077/0c69a449-a472-f955-e0dd-aaa4564d7bd6.png)

これをPCブラウザの時は、
>ようこそ「みんなでフランス語」へ
みんなでフランス語、日本語の知識を共有しましょう

スマホの時は、

>ようこそ
「みんなでフランス語」へ
みんなでフランス語、日本語の知識を
共有しましょう

という具合で改行したいです。

HTMLで`
`タグを仕込んで、CSS側の`display`とメディアクエリを活用して操作すれば良いかと思ったので

元記事を表示

Railsである程度実装ができるようになったら

# はじめに
記念すべき DMM WEBCAMP Advent Calendar 2021 :christmas_tree: 1日目を担当します @SawaShuyaです!

Railsで開発を進めていると、3~4カ月ほどで設計から実装まである程度自力で開発できるようになってくると思います!
今回は、railsをある程度自力で書くことができるようになった方向けに、次にどのようなことを学んでいけばいいのかを書いていきたいと思います:shamrock:

構成は
1. rubyを学ぶ
2. railsの開発スキルを磨く
3. 周辺知識を学ぶ
となっておりますので、興味のある部分だけでも見ていただけたらと思います!

# 1. Rubyを学ぶ
railsはすべてrubyで書かれてます。rubyを深めていくことで、これまでは何気なく扱っていたclassやmodule、オブジェクトなどを理解することができ、より効率の良い開発ができるようになります!

では

元記事を表示

Apple silicon (M1 Max)でMailCatcherをインストールする

M1 MacでMailCatcher( https://mailcatcher.me/ )をインストールしようとした際にちょっとつまづいたので、解決策を備忘録的に。

# 環境

* MacBook Pro (2021)
* M1 Max
* macOS Monterey v12.0.1
* ruby 2.6.8p205 (2021-07-07 revision 67951) [universal.arm64e-darwin21]

# うまくいかなかった時

普通にMailCatcherのサイトにあるように

“`
% gem install mailcatcher
“`

を叩いたら

“`
ERROR: While executing gem … (Gem::FilePermissionError)
You don’t have write permissions for the /Library/Ruby/Gems/2.6.0 directory.
“`

とパーミッションエラーが出たので、「あちゃ、ヤベヤベ……」と`sudo`つけて再度`gem inst

元記事を表示

【オブジェクト指向】カプセル化

##カプセル化
オブジェクト同士の紐付き(関係性)を薄くし、独立性を高め、再利用や交換といった保守性を高める効率の考え方。

“`ruby
class Foo
def initialize(foo=’foo’, bar=’bar’)
@foo = foo
@bar = bar
end
end

f = Foo.new
f.foo
#=> NoMethodError: undefined method `foo’ for #
“`

– “`attr_accessor :foo, :bar“`と書くだけでインスタンス変数“`@foo“`と“`@bar“`にアクセスできるように

“`ruby
class Foo
attr_accessor :foo, :bar
def initialize(foo=’foo’, bar=’bar’)
@foo = foo
@bar = bar
end
end

元記事を表示

【Ruby】メソッドのオーバーライド

##メソッドのオーバーライド

親クラスを継承した子クラスで同じメソッドを定義するとメソッドがオーバーライドされる。

“`ruby
class Parent
def talk
puts ‘早く寝なさい’
end
end

class Child < Parent def talk puts '眠い' end end p = Parent.new p.talk #=> 早く寝なさい

p = Child.new
p.talk
#=> 眠い
“`

##super
オーバーライドされる前のメソッドを呼び出すことができるメソッド。
“`super“`で親クラスの“`talk“`メソッドを呼び出している。

“`ruby
class Parent
def talk
puts ‘早く寝なさい’
end
end

class Child < Parent def talk super puts '眠い' end end p.talk #=> 早く寝なさい
#=> 眠い
“`

##参考

https:

元記事を表示

【RSpec】APIのリクエストテストでgemはあまり使われていないらしい

APIのリクエストテストをやる際、
jsonが期待通りに取れているかをもっとわかりやすく書けないかと思ったときにいくつかgemを発見した。

– [jsonapi-rspec](https://github.com/jsonapi-rb/jsonapi-rspec/)
– [rspec-json_matcher](https://github.com/r7kamura/rspec-json_matcher)

最後のコミットが何年も前だったこと、starの数もあまり多くなかったこと、実際に使ってみて使いづらかったことを踏まえてgemは使わずやることにした。

gemを使ったAPIのリクエストテストの方法をあまり記事で見かけなかったので、みんなそもそもgemを使わないのかなーとも思った。

“`spec.rb

it ‘自分の本の情報が昇順に返ること’ do
json = JSON.parse(response.body)
expect(response.status).to eq 200
expect(json[‘books’]).to eq([
{“id

元記事を表示

個人ブログのスパム対策に関して(Rails)

## 概要
先日、Railsで開発した個人ブログを公開しました。
– [Niken log](https://nikenlog.com/)
– [サービス概要](https://nikenlog.com/blogs/16)

その公開に伴いGoogleのサーチコンソールに登録したは良いものの、問い合わせフォームに、RichardcenceさんやGeorgewetさんなど知らない外国人から「登録したら〇〇ドルもらえる!」というスパムが大量に届いたため、その対策として行ったことを簡単にまとめます。

![スクリーンショット 2021-11-19 14.57.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425582/6b198bfc-f1cd-8099-7a1c-7647633ca775.png)

## 1. URLのバリデーション
早急にbot等でのスパムメールを送れないようにするため、まず初めに問い合わせフォームの本文にURLのバリデーションを設定しました。

“`model.rb

## U

元記事を表示

新規Railsアプリケーションの雛形作成〜データベース作成まで

# 新規Railsアプリケーション雛形作成
railsをPCにインストールしている前提で説明していきます。
今回、Railsのバージョンは6.0.0を使用。
データベース管理システムはmysqlを使用します。

ターミナル

“`
# アプリケーションを入れたいディレクトリに移動
% cd ~/〇〇〇〇(ディレクトリ名)

# Railsアプリケーションで用いる仕組みの一部を設定するコマンドを実行
% bundle config –global build.mysql2 –with-opt-dir=”$(brew –prefix openssl@1.1)”

# Railsのバージョン6.0.0を用いて、新しいAppを作成(〇の箇所には好きなアプリ名を入れる
% rails _6.0.0_ new 〇〇〇〇_app -d mysql

# 「〇〇〇〇_app」ディレクトリに移動
% cd 〇〇〇〇_app

“`

上記の操作を行って、
/Users/ユーザー名/指定したディレクトリ名/指定したアプリ名
と表示されれば作成完了です。

# データベース作成
ターミナル

元記事を表示

【RSpec】APIテストでformat: :json

##環境
Ruby 3.0.2
Rails 6.1.4.1

“`routes.rb“`で“`format: :json“`指定しておくと、
APIテストの方で省略できる。

“`config/routes.rb
Rails.application.routes.draw do
namespace :api, format: ‘json’ do
resources :users
end
end
“`

“`spec.rb
get api_v1_abc_path(format: :json)

#↓

get ‘/api/v1/abc’
“`

##参考

https://qiita.com/kat0/items/be6114fb4694b9576304

元記事を表示

【RSpec】Doorkeeperを使用したAPIのリクエストテスト

doorkeeperのgemを使用していて、リクエストテストでアクセストークンが必要な場合のやり方

##環境
Ruby 3.0.2
Rails 6.1.4.1

##Factoryの作成
アクセストークンをFactoryで擬似的に作成。
factories下に“`applications.rb“`と“`access_tokens.rb“`を作成

“`spec/factories/doorkeeper/applications.rb
FactoryBot.define do
factory :doorkeeper_application, class: ‘Doorkeeper::Application’ do
sequence(:name) { |n| “Application #{n}” }
redirect_uri { ‘https://アプリのURI/callback’ }
end
end
“`

“`spec/factories/doorkeeper/access_tokens.rb
FactoryBot.define do
fac

元記事を表示

【Rails】本番環境でCSSで指定した背景画像が表示されない。。。の解消

## 環境
Rails 6.1.4

## やりたいこと
ローカルで正常に表示されていた背景画像が本番環境で表示されなかったことの解消

## 結論
SCSSファイル内の記述を次のように書き換えデプロイすることで正常に表示。

“`sass:app/assets/stylesheets/〇〇.scss
//修正前
background-image: url(‘bg-image.jpg’);

//修正後
background-image: image-url(‘bg-image.jpg’);
“`

## なぜ起こったのか?
アセットパイプラインのキャッシュの高速化と『digest』という仕組みが関係している。
上記によって、**デプロイ後のapp/assets以下のファイルは全てpublic/assetsに上記のdigest付きになって移動**され、参照できなくなったことにより発生したもの。

## 参考記事

https://railsguides.jp/asset_pipeline.html#production%E7%92%B0%E5%A2%83%E3%81%AE%E5%A

元記事を表示

Railsでbcryptエラー(cannot load such file — bcrypt)が出た時の対処法

【エラー内容】
パスワード暗号化のため、Gemfileにコメントアウトされていたbcryptを導入したところ、以下のエラーが発生しました。

“`
cannot load such file — bcrypt
“`

「bundle install」も実行しており、Userモデル内に「has_secure_password」を記述してもエラーが解消しませんでした。

【対処法】
Railsサーバーを一度停止し、再起動(rails s)する事でbcryptの内容が反映されました。
困ったらサーバーの再起動も試してみるべきですね。

元記事を表示

FactoryBot のまとめ

## **FactoryBot とは**

factory_bot_rails といった gem を導入することで使える。

→ model のデータに紐づいたテストデータを簡単に作るためのもの。

spec 配下の factories の中に定義する。

各モデルのファイルを作成して、カラムに基づくデータを Faker を使って定義する。

> Faker とは… ダミーデータを作るのに便利な gem のこと。
>

**定義したデータをテストの際などで呼び出すことが可能になる!**

## **FactoryBot の定義の仕方**

`FactoryBot.define`を`do 〜 end` の中で定義するような書き方をする。

作成例)

“`ruby
FactoryBot.define do
factory :article do
title { Faker::Lorem.word }
body { Faker::Lorem.sentence }
end
end
“`

上記のような書き方だと、
title カラムでは、`Faker::Lor

元記事を表示

【jbuilder】部分テンプレートのオプション

##環境
Ruby 3.0.2
Rails 6.1.4.1

##部分テンプレート

部分テンプレート内で呼び出し方を“`as“`で指定
2つとも同じように取れる

“`app/views/users/index.json.jbuilder
json.partial! ‘users/user’, collection: @users, as: :user

#or

json.array! @users, partial: ‘users/user’, as: :user
“`

“`app/views/users/_user.json.jbuilder
json.extract! user, :id, :name, :age
“`

##参考

https://github.com/rails/jbuilder

元記事を表示

【Rails】IN句の書き方

IN句の書き方いろいろ

“`ruby
User.where(id: [1, 3, 6])
#=> SELECT `users`.* FROM `users` WHERE `users`.`id` IN (‘1’, ‘3’, ‘6’)
“`

“`ruby
ids = [1, 3, 6]
User.where(‘id IN (?)’, ids)
#=> SELECT `users`.* FROM `users` WHERE (id IN (1, 3, 6))
“`

“`ruby
User.where(‘id IN (?)’, [1, 3, 6])
#=> SELECT `users`.* FROM `users` WHERE (id IN (1, 3, 6))
“`

“`ruby
User.where(‘id IN (1, 3, 6)’)
#=> SELECT `users`.* FROM `users` WHERE (id IN (1, 3, 6))
“`

元記事を表示

【Rails】Routingのネスト,member, collectionの違い

###はじめに
Railsでアプリケーション作成しております。
作成中にルーティングについて少々学習したので、自分用のメモとして残しておきます。

###ルーティングについて
ルーティングは、受け取ったHTTPリクエストに応じて、特定のコントローラー内のアクションを動作するように割り当てを行なっている。
Railsのルーティングは`config/routes.rb`で設定する。

“`ruby:config/routes.rb
Rails.application.routes.draw do
# ここにルーティングを設定する
root ‘home#index’
end

“`

設定したルーティングは、以下のコマンドを実行することで確認できます。

“`:ターミナル
$ bin/rails routes

Prefix Verb URI Pattern Controller#Action
root GET / home#index
“`
###実装したかったこと(前提)
ユーザー(user)が、ある施設(house)に口

元記事を表示

【Rails】SQLでor検索

A OR Bの結果が出力される。

“`ruby
User.where(name: ‘コナン’)
.or(User.where(email: ‘ran@gmail.com’))
#=> SELECT `users`.* FROM `users` WHERE (`users`.`name` = ‘コナン’ OR `users`.`email` = ‘ran@gmail.com’)
“`

orメソッドがまだなかったときはこんな書き方をよく見かけたらしい。

“`ruby
User.where(“name = ? OR email = ?”, ‘コナン’, ‘ran@gmail.com’)
#=> SELECT `users`.* FROM `users` WHERE (name = ‘コナン’ OR email = ‘ran@gmail.com’)
“`

元記事を表示

【Rails】複数レコード一括保存のRspecの書き方

https://ryucoding.com/programming/rails-form-bulk-create
で紹介されている複数レコードを一括保存するcreateアクションをテストするリクエストspecの書き方で詰まったのでその備忘録です。

#テスト対象のコントローラーとアクション

“`
//questions_controller
def create
@form = Form::QuestionCollection.new(question_collection_params)
if @form.save
redirect_to root_url
else
render ‘new’
end
end
.
.
.
.
.

def question_collection_params
params.require(:form_question_collection).permit(questions_attributes: [:content, :mode_num])
end

“`
クイズ出題ア

元記事を表示

OTHERカテゴリの最新記事