- 1. 【Rails】whereの戻り値に気を付けようという話
- 2. Railsのコードをリーズナブルに自動コードレビューをしてもらうためのGithub Actions
- 3. System SpecとFeature Specは何が違うの?
- 4. [Rails]モデルのバリデーション「lengthチェック」の閾値はテーブル情報から動的に取得しよう
- 5. Railsでよく使うGem
- 6. 【AWS】EC2インスタンス(ターゲットグループ)のヘルスチェックにどうしても失敗する。。
- 7. Leet文字列(ruby編)
- 8. ターミナルでRailsコマンドを確認する方法
- 9. 間違ってモデルを作ってしまった時の対処法
- 10. RSpecとFactoryBotを使ったインスタンスの作成
- 11. net/httpを利用した外部API連携クラスの作成手順
- 12. 【Rails】Travis CIを導入してdb:createで詰まったこと
- 13. 【Ruby/Rails】Rails6でのjQuery導入方法
- 14. 【ActiveAdmin】デフォルトのcreateとupdateの処理をカスタマイズしたい
- 15. 【ActiveAdmin】select_boxで表示するcollectionのscopeを指定したい
- 16. deviseで使えるヘルパーメソッド
- 17. Rails, RSpecの導入手順
- 18. deviseでストロングパラメーターを使えるようにする
- 19. 備忘録:Railsによるコメント機能実装
- 20. Railsでいいね機能のAjax処理を実装してみた
【Rails】whereの戻り値に気を付けようという話
## はじめに
#### なぜ書いたか
– whereやpluckの戻り値を理解しておらず、詰まった経験を共有します
– 「`.id`でいけるだろ」と、ActiveRecordを乱用してしまうことに反省の意味を込めて#### 結論
– whereやpluckの戻り値は配列である
– ActiveRecordのメソッドチェインの使い所を理解しよう## 前提
#### 環境
・ Ruby 2.6.5
・ Rails 6.0.3
・ devise(userモデル)を使用
#### ER図
![スクリーンショット 2020-11-08 18.04.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708469/2a6cc9b7-29af-7310-7992-428ec062994a.png)roomsテーブル: DMする部屋を管理します
user_roomsテーブル: userとroomの組み合わせを管理します#### やりたいこと
![スクリーンショット 2020-11-08 16.44
Railsのコードをリーズナブルに自動コードレビューをしてもらうためのGithub Actions
## はじめに
[GitHub Actions](https://github.co.jp/features/actions)には[Marget Place](https://github.com/marketplace?type=actions)でいろいろなActionが公開されていて、導入するだけでRailsプロジェクトで即使えます。ただ…そのままだと仮想マシンを何台も使うので、プライベートなリポジトリではあっという間にクレジットを消費してしまいます…。そこで、自分達のプロジェクト用に作ることにしました。
対象プロジェクト全体を解析し、常にクリーンに保つようにできればよいのですが、途中から入れたせいもあり、なかなかできず…。それなので最低限各々が出したプルリクエストに対してキレイにしようという方針です。
試したときのコードは[こちら](https://github.com/ken1flan/test_with_reviewdog)です。
https://github.com/ken1flan/test_with_reviewdog## 今回使っているツール(ありがとうござ
System SpecとFeature Specは何が違うの?
新しいRailsプロジェクトに取り組む際に、テストもしっかり書こうと思い調べたことをまとめます。
## System SpecとFeature Specの違い
どちらもRSpecで提供されているE2Eテスト機能です。
Feature Specのほうが歴史が長く、古いバージョンのRailsプロジェクトではこちらがよく使われていると思います。Rails5.1で`SystemTestCase`という新しいテストケースクラスが導入され、これをラップした (使えるようにした) System SpecがRSpecでも導入されました。
[RSpecリリース](https://rspec.info/ja/blog/2017/10/rspec-3-7-has-been-released/)結果として両者が共存している状態ですが、公式READMEではSystem Specが推奨、Feature Specは引き続きサポートしていくことが表明されています。
> Before Rails introduced system testing facilities, feature specs we
[Rails]モデルのバリデーション「lengthチェック」の閾値はテーブル情報から動的に取得しよう
下記のusersテーブルがあるとします。
“`console
mysql> desc users;
+—————————–+————-+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+—————————–+————-+——+—–+———+—————-+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| name | varchar(100)| NO | | NULL | |
| created_at
Railsでよく使うGem
TL; DR
(まだかきかけ)
私がRailsでよく使うGemをメモしました。
一番良く使っているRailsのバージョンは5.2.xです。* config (Environmentごとの設定をYAMLで記述する)
* haml-rails (ビューの記述言語としてHamlを利用する)
* boostrap (CSSフレームワークのBootstrap)
* font-awesome-sass (FontAwesomeを使う)
* activerecord-session_store (RailsのセッションをActiveRecordに保存する)
* gretel (パンくずリストの管理)
* enum_help (enumのI18N化)
* rails-i18n (各国語用のロケールデータ)
* auto_strip_attributes (ActiveRecordのattributesの文字列をstripしたり、nilにしたり)
* email_validator (メールアドレスのvalidation)
* whenever (crontabにスケジュールを書き込む。Capis
【AWS】EC2インスタンス(ターゲットグループ)のヘルスチェックにどうしても失敗する。。
現在個人開発しているRailsアプリがやっと完成し、AWSへのデプロイ作業にチャレンジしました。(ECR × ECS × CircleCIを利用し、gitからmasterブランチへpushするとCIがビルドされ、テストが通ると自動デプロイされるといった感じの構成です)
その際、EC2インスタンスへのヘルスチェックが通らずに困り果ててしまったので、ついにプログラミング独学勢?の切り札であるMENTAを利用しました。
そしたら1~2週間程悩んでいた問題が開始わずか10分ほどで解決してしまい、あっけなく終わってしまいました。。調べてもこの解決方法はなかなか見当たらなかった(多分僕の探し方の問題)ので、僕と同じように膨大な時間を無駄にしないためにも、ここに備忘録として残そうと思います!
**今回相談させていただいたメンタ―さん**
[ルビコン@クラウド(AWS)エンジニアさん](https://menta.work/user/8155)
[ルビコンさんのTwitter](https://twitter.com/RubiconLink)単発の利用だったにもかかわらず、本題とは関係ない質
Leet文字列(ruby編)
#Leet文字列(ruby編)
#先に言っておくと、期待通りの出力ができなかったので分かる方教えて頂けると嬉しいです?
#問題
Leet ではいくつかのアルファベットをよく似た形の他の文字に置き換えて表記します。 Leet の置き換え規則はたくさんありますが、ここでは次の置き換え規則のみを考えましょう。
置き換え前 置き換え後
A 8
E 3
G 6
I 1
O 0
S 5
Z 2文字列が入力されるので、これを Leet に変換して出力するプログラムを書いてください。
#入力される値
入力は以下のフォーマットで与えられます。
i
i は Leet に変換する前の文字列を表します。
#期待する出力
i を Leet に変換した文字列を1行に出力してください。
#入力例1
APPLE
#出力例1
8PPL3
#私の答え(誤った答えです)
“`java:ruby
array = {
“A” => “8”,
“E” => “3”,
“G” => “6”,
“I” => “1”,
“O” => “0”,
“S” => “5”,
“Z” => “2”
}
str = gets.gsub(/[
ターミナルでRailsコマンドを確認する方法
#はじめに
ターミナルのコマンドで、複数形なのか単数形なのか、忘れてしまうことがあり、簡単に知ることができないかと思い、調べてみた。#ターミナルでコマンドを確認
“`bash
% rails g –help
“`
と実行すると、`rails g`に続けられるコマンドが一覧となって表示される。
自分の導入しているGemに限られるが、それぞれのGemで使えるコマンドが表示される。
`g`を`d`に変えて、deleteのコマンドも見ることができる。
コマンドを忘れていしまった時に使える!##最後に
完全に余談だが、“`bash
% cal
“`
を実行すると、カレンダーが表示される。
間違ってモデルを作ってしまった時の対処法
#結論
下記のようにモデルのみを指定して削除します。“`ruby:ターミナル
rails destroy model [モデル名]
“`
モデルを削除するときはカラムを指定する必要はないのでこのようなコマンドになります。ただ、`rails db:migrate`をしてしまっていた場合は、テーブルを作成してしまっているので念のためにテーブルの削除をした方がいいと思います。
#テーブルの削除方法
###マイグレーションファイルを編集する
`create_table :comments`の部分を`drop_table :comments`に変更する。“`
class CreateComments < ActiveRecord::Migration[6.0] def change create_table :comments do |t| t.string :content end end ``` 最後にターミナルで以下のコマンドを打てばデータベールからテーブルが削除されます。 ``` rails db:migrate ``` #参考記
RSpecとFactoryBotを使ったインスタンスの作成
# はじめに
先日こんなツイートをしました。RSpecわからん!ということで時間とって書籍で勉強。#everydayrailsjp #駆け出しエンジニア
— Shun Tagami (@programganbaru) net/httpを利用した外部API連携クラスの作成手順
アプリケーション開発をするにあたり、外部サービスとAPI連携を行う場合があります。
RubyではHTTP通信を行う標準ライブラリとして[net/http](https://docs.ruby-lang.org/ja/1.9.3/library/net=2fhttps.html)が用意されています。
今回はnet/httpを利用して、API経由で外部サービスのデータを取得する方法について紹介します。## 今回作成するもの
今回は外部サービスの例としてQiitaを利用します。ゴールは以下の通りです。
– `QiitaClientAPI`というQiita APIと連携するクラスを作成する
– `get_items`というクラスメソッドを利用することでQiitaの記事一覧が取得できるようにする
– API連携でエラーが発生した場合は、エラーレスポンスの内容を例外として出力する
– `localhost:3000/qiita_items`を実行すると`QiitaClientAPI.get_items`の結果が取得できるなお、今回紹介するサンプルは`rails 6.0.3.4`のA
【Rails】Travis CIを導入してdb:createで詰まったこと
# はじめに
自動テストツール`Travis CI`を導入するときにつまづいたことを書きます。# 環境
・Ruby 2.6.5
・Rails 6.0.3.2
・Mysql Ver 14.14 Distrib 5.6.47# 問題点
以下のような`.travis.yml`に記述している`db:create`がどうしても通らないという問題が発生しました。“`yaml
script:
– bundle exec rake db:create RAILS_ENV=test
– bundle exec rake db:migrate RAILS_ENV=test
– bundle exec rspec
“``Travis CI`の画面ではこのようなエラーメッセージがでました。
![DBcreate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667396/43835429-0815-b85e-2299-ea2fc58ab7f5.png)
“`
Mysql2::Error:
【Ruby/Rails】Rails6でのjQuery導入方法
# はじめに
## やりたいこと
– いいね機能のAjax対応を実装したい
– そのためにjQueryを導入したい## 動作環境
ruby 2.6.5 / Rails 6.0.3.4## やってみて
Rails6から標準装備されているWebpackerを利用することで簡単に実装できました。
多くの記事がRails5までの情報でとっっっても遠回りしたので、6以降の方は僕のように無駄な時間を使わないでいただけたら…##参考URL
[Railsガイド > Rails で JavaScript を使用する](https://railsguides.jp/working_with_javascript_in_rails.html)#手順
– jQueryのインストール
– Webpackの設定
– application.jsの設定
– 動作確認## jQueryのインストール
そもそもjQueryとは
>JavaScriptをより簡単に記述するためのライブラリのひとつ。したがって、jQuery(ライブラリ)を使うのであればJavaScript(元のプログラミング言語)に
【ActiveAdmin】デフォルトのcreateとupdateの処理をカスタマイズしたい
記事はこちら↓
[【ActiveAdmin】デフォルトのcreateとupdateの処理をカスタマイズしたい](https://www.malanka.tech/entry/Customizing-the-default-create-and-update-process-_in-ActiveAdmin)
【ActiveAdmin】select_boxで表示するcollectionのscopeを指定したい
記事はこちら↓
[【ActiveAdmin】select_boxで表示するcollectionのscopeを指定したい](https://www.malanka.tech/entry/Specify-the-scope-of-the-collection-to-be-displayed_-in-select_box-in-ActiveAdmin)
deviseで使えるヘルパーメソッド
| メソッド | 用途 |
|:——-|:————|
|before_action :authenticate_user!|コントローラに設定し、ユーザーのみアクセスを許可する。|
|user_signed_in?|ユーザーがログインしているかどうか判定を行う。ユーザーがログインしていればtrueを、ログアウト状態であればfalseを返します。|
|current_user|現在ログインしているユーザー取得する|
|user_session|ユーザーのセッション情報にアクセスする|##before_action :authenticate_user!
ログイン状態によって表示するページを切り替えるdeviseのメソッド。“`
class SampleController < ApplicationController before_action :authenticate_user!, only: [:show] def index end def show end end ``` onlyオプションを使うと、show
Rails, RSpecの導入手順
# 環境
rails 6.0.3.4
ruby 2.6.5# 流れ
・モデルの単体テストの目的、何をテストするのか
・RSpec導入準備(必要なgemのインストール)
このような流れで説明していきます。# 1 テストの目的
結論、コードの保守性を保つためです。当たり前ですがリリースしたアプリケーションにバグが生じるのは望ましくありません。バグが生じないことを手作業で確かめるの思わぬ見落としがあるかもしれない、ということで信頼できるテストを書いておけばコードに変更があった際でも「テストが通ったからok」と手作業で挙動を確かめる手間を省けるということです。# 2 何をテストするか
① バリデーション
データベースに値を保存する際には「空の値を保存しない」、「文字数は何文字以内」、「数字のみ保存する」、「大文字は小文字に変換する」などのルールを定義します。規則性のない値が保存されてしまうことがデータベース設計上望ましくないからです。rails側でこのルールを定義する方法がモデルのバリデーションです。そのため、モデルのテストではバリデーションが正しく動作しているかをチェックします。
deviseでストロングパラメーターを使えるようにする
個人的に苦手なdeviseを使用する際に記述するメソッドなど。備忘録として
##devise_parameter_sanitizerメソッド
“`
private
def configure_permitted_parameters
# deviseのUserモデルにパラメーターを許可
devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])
end
“`
ストロングパラメーターをコントローラーに記述するが、deviseの処理を行うコントローラーはGem内に記述されているため、編集することができない。また、deviseでログイン機能を実装した場合は、paramsの他に、paramsとは異なる形のパラメーターも受け取っています。deviseのコントローラーにストロングパラメーターを反映する方法と、devise特有のパラメーターを取得する方法が、必要になります。##devise_parameter_sanitizerメソッド
deviseのUserモデルに関わる「ログイン」「新規登録」などのリクエストか
備忘録:Railsによるコメント機能実装
#はじめに
Rubu on Railsでオリジナルアプリを作成しています。そのアプリにコメント機能を実装しました。そのため忘れないように書き記します。#手順
・commentモデル、テーブルの作成
・commentsコントローラーとルーティングの設定
・各コントローラーのアクション設定#commentモデル、テーブルの作成
はじめに下記のようにターミナルでcommentモデルを作成します。“`bash
rails g model comment
“`その後マイグレーションファイルに、textカラムを追加します(このtextカラムにはコメントが保存されます)。
“`ruby:2020*********_create_comments.rb
class CreateComments < ActiveRecord::Migration[6.0] def change create_table :comments do |t| t.text :text, null: false t.references :user, foreign_
Railsでいいね機能のAjax処理を実装してみた
# はじめに
Railsでいいね機能を実装していたのですが、この機能を使うと下記のような問題が発生していました。– ページ全体をレンダリングし直すため、無駄な処理を伴ってしまう。
– ページ遷移が伴ってしまうため、ページ下部でlikeやコメントをしてもページの一番上に遷移してしまい、ユーザービリティを下げている。そのため、Ajax機能追加し、ページ遷移を伴わないようにしてユーザービリティをあげようと思いました。
最初考えた実装方法は、JavaScript・jQueryを使って、Ajax処理を発火していく方法がベストなのかなと思ったのですが、調べていくと、Railsには、“`link_to“`などのメソッドに“`remote: true“`を引数で付けるとAjax処理を使えるようになるとのことでした。最初考えてた実装方法と違って、簡潔だったので、さっそくその方法で実装してみました。
# 前提
– 投稿機能・いいね機能は既に実装済み。
– 実装しているいいね機能は、いいねボタンを押下すると、ページ遷移が伴うタイプのもの。
– 上記に対して、Ajax処理で、非同期通