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

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

個人ブログのスパム対策に関して(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

“`
クイズ出題ア

元記事を表示

【Rails】左外部結合と内部結合

##環境
Ruby 3.0.2
Rails 6.1.4.1

##前提条件
“`ruby
class Owner < ActiveRecord::Base has_many :dogs end class Dog < ActiveRecord::Base belongs_to :owner end ``` ##左外部結合 左側のテーブルにしかないレコードも取得して結合する。 下の例でいうと、飼犬がいないオーナーのデータも取得できる。 ```ruby Owner.left_joins(:dogs) => SELECT `owners`.* FROM `owners` LEFT OUTER JOIN `dogs` ON `dogs`.`owner_id` = `owners`.`id`
“`

##内部結合
結合条件に一致するレコードのみを結合する。
下の例でいうと、飼犬がいるオーナーのデータのみ取得できる。

“`ruby
Owner.joins(:dogs)
=> SELECT `owners`.* FROM `owners` INNER JOIN `do

元記事を表示

【Railsチュートリアル】ユーザー検索機能の実装

#はじめに

前回の記事[【Railsチュートリアル】いいね機能の実装](https://qiita.com/supyolo888/items/8c3beaf25811e0a98efb)に引き続きRailsチュートリアル第6版sample_appの機能拡張を進めていく。
今回は以下の様なユーザー検索機能を実装していく。
![スクリーンショット 2021-11-28 21.42.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2200191/e46fbcf8-1bb4-e26f-51d6-693bf2c71e12.png)

**前提**
第6版sample_appが完成している

#手順

Gemfileにransackを追加

“`rb:Gemfile
gem ‘ransack’
“`

検索フォームを作成

“`rb:app/views/users/_search_form.html.erb
<%= search_form_for @q do |f| %>
<%= f.label :n

元記事を表示

bundle installが原因でdocker-composeが立ち上がらなかった話

everyday-railsというテスト本を元にdocker環境で学習しようとしたのがことの発端です。
私自身dockerのことをよくわかっていなかったので、なかなか解決に時間がかかってしまいました。

# 前提
この記事では、docker-composeにrailsの環境(everyday-railsで用意されているソースを元に使います。)を構築するにあたって遭遇したエラーとその対処について書きます。

# Dockerファイルなど

### dockerファイル

“`docker:dockerfile
FROM ruby:2.7
ENV LANG C.UTF-8

RUN apt-get update -qq && apt-get install -y \
build-essential \
nodejs \
&& rm -rf /var/lib/apt/lists/*

RUN gem install bundler

WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bun

元記事を表示

「Ruby」where文で同じカラムで複数指定する方法

#where文で配列を同じカラムで複数指定する方法

変更前

“`
@q = Tweet.where(completed: “0”)
“`
変更後

“`
@q = where(completed: [‘0’, ‘1’])
“`
このように配列にすれば指定できる。

元記事を表示

kaminariの導入からオリジナルページネーションデザインを作成する

kmainariのページネーションデザインをどうするかを考えたことがあるかと思います。テンプレートもあるので手軽に作ることもできますがオリジナルがいいなと思ったので今回はその作り方をアウトプットしていきます。

作成するページネーション↓
![スクリーンショット 2021-11-28 14.42.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645779/e524bf15-5e7e-7edc-d01c-aa5be8c405c6.png)

基本的にはstyleをあてるだけなので、もっとかっこいいものも作れますよ。

https://github.com/taiki-nd/kaminari-design

# アプリ作成
“rails _6.1.4.1_ new kaminari-design -d mysql“
“rails db:create“

# サーバーサイドの構築
scaffoldでサクッと作成していきます。
“rails g scaffold post title:stri

元記事を表示

【しくじり先生】失敗続きの未経験からのエンジニア転職1年間を振り返って最短で満足のいく転職をするにはどうすれば良いかを考えてみた

# はじめに
こんにちは、28歳未経験から12月より150名規模の自社開発企業で働くことになったもきおです。エンジニア転職を目指し2020年10月に前職を辞め、早1年も経ってしまいました。
仕事をしていながらなら分かるが学習にコミットして流石に一年は長かった。

1年間色々と細かい失敗を繰り返し続けました。でも失敗ばかりだったから伝えられることも多くあると思うんです。そこで今回は今までの流れを振り返りつつ、失敗から何を学びどのようにすればもっと早く満足のいくエンジニア転職ができるかを考えてみました。

書きたいことが多く結構なボリュームになってしまいましたが最後までご覧いただけますと幸いです。

# こんな人に読んで欲しい
・プログラミングスクールからエンジニア転職を目指している方
・独学からエンジニア転職を目指している方
・エンジニア転職活動をしている方
・これからプログラミングを学んでエンジニア転職を考えている方

#今までの流れ
まず初めに「おいもきお、一年も何やってたんだよ」と声が聞こえてきそうなので今までの流れをざっと表で振り返っていきます。

|期間|やったこと|
|–

元記事を表示

インチキをしてRailsでExcelを読み書きする

## Excel大好きな人達

多くの案件ではExcel好きなプロパーとかExcel好きなプロパーとかExcel好きなプロパーが跋扈しており、確固たる理由はないがなんとなく「Excelライクで」とか言われることが非常に多いと感じています。
Excelライクと言わないまでも、Excelをアップロードできたりダウンロードできたりと言った要件は、非常にカジュアルに生じています。

「DXの意味わかっているの?」と言いたくなるのですが、これが原状なのでしょうがありません。

## Railsライブラリの限界
ただ、Railsエンジニアなら一度は経験したことがあると思うのですが、RailsにはExcelをうまく扱えるライブラリがあまりありません。

|ライブラリ|機能|注記|
|-|-|-|
|Axlsx|新規作成から書き出しだけ|新規作成のみで、テンプレートファイルからの新規作成もできない。複雑なワークシートを作ろうと思うと、コードが恐ろしく読みにくくなる|
|Roo|読み込みだけ|読み込み専用|
|RubyXL|読み書き可能|数少ない読み書き可能なライブラリだが、`parse`が恐ろしく遅い

元記事を表示

【Railsチュートリアル】いいね機能の実装

#はじめに

前回の記事[改【Railsチュートリアル】プロフィール画像をアプリ内で設定できるように変更](https://qiita.com/supyolo888/items/c1073ada0b04fb2f9e7f)に引き続きRailsチュートリアル第6版sample_appの機能拡張を進めていく。
今回は以下の様ないいね機能を実装していく。
![スクリーンショット 2021-11-28 3.17.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2200191/c76e336e-19be-1c53-bf34-b3c5a4c9fcc1.png)
**前提**
第6版sample_appが完成している

#Favoriteモデル

Favoriteテーブルを追加

“`
$ rails g model Favorite user_id:integer micropost_id:integer
“`

user_idとmicropost_idにインデックスを追加し、組み合わせがユニークであるという

元記事を表示

OTHERカテゴリの最新記事