- 0.1. Dockerを使用したWebアプリケーションの開発環境を改善し開発者体験を良くする
- 0.2. Wardenのwikiを翻訳してみた
- 0.3. 現状のSwaggerスキーマとシリアライザの改善を行なった話
- 0.4. controllerのインスタンス変数をなんでviewでも使えるの?
- 0.5. Stimulus リファレンス: ライフサイクルコールバック
- 0.6. Rails のフロントエンドツールに vite_rails を使う
- 0.7. 【Rails6】レビューの平均値をレーダーチャートで表示する方法(gon、chartkick、chart.js)
- 0.8. 同じpage内でStimulus 同一のcontrollerを何度も利用したいとき
- 0.9. Railsの「開発」環境へのデプロイ
- 0.10. RailsでWebアプリを作成する際に導入して良かった設計やgem
- 0.11. 【Rspec】レシーバーの「FactoryBot」の記述を省略する設定
- 0.12. RSpecでtravel_toを使ってみた
- 0.13. 【Rspec】FactoryBotとは
- 0.14. Ruby on Rails のバリデーション
- 0.15. railsコマンドまとめ[備忘録:随時追加予定]
- 1. コントローラの自動生成
- 2. 作成したコントローラの削除
- 3. モデルの自動生成
- 4. 作成したモデルの削除
- 5. データベースのマイグレーションを変更
Dockerを使用したWebアプリケーションの開発環境を改善し開発者体験を良くする
:::note info
[LITALICO Advent Calendar 2022](https://qiita.com/advent-calendar/2022/litalico) 18日目の記事です
:::# 対象読者
– 開発者体験をもっと良くしたいと考えている開発者・マネージャー
– 開発環境をもっと早くしたいと考えている方
– 最近RailsやLaravelの起動が遅くて困っている方
– フロントエンドのビルドが遅くてイライラする方
– Mac使用者(Windowsユーザーの方にも参考にできる部分はあると思います)
– Docker DesktopやRancher Desktopの遅さにうんざりしている方# この記事について
この記事は「開発環境を改善し開発者体験を良くする」をテーマとしており、
開発環境を遅くしている原因と、それに対する解決策が書いてあります。想定は以下の通りですが、そうでない場合も有効な案はあると思います。
– バックエンドはRailsやLaravelなどのWebフレームワークを使用している
– フロントエンドはVueやReactな
Wardenのwikiを翻訳してみた
Deviseのベースになっているgem “Warden”のwikiを翻訳してみました。(2022/12/18時点)
誤訳のご指摘があれば修正します。# Warden
Warden wikiへようこそ。WardenはRackベースのRubyアプリケーションでの認証メカニズムを提供します。同じRackインスタンス内で複数のアプリケーションを共有することを念頭に作られています。
ここに長いドキュメントがあります。ドキュメントは最新を保つように努めますが、正確な詳細についてはソースコードやソースドキュメントを参照してください## Overview
### The What
WardenはRubyWebアプリケーションの認証メカニズムを提供するために設計されたRackベースのミドルウェアです。Rackの構成要素に合う一般的なメカニズムで、認証用に強力な選択肢を提供します。
Wardenは怠惰に設計されています。つまり、使わないときには何もせず、使うときには突然動き出して、どんなRackベースのアプリケーションでも認証を許可する基本的メカニズムを提供するのです。### The Why
現状のSwaggerスキーマとシリアライザの改善を行なった話
## はじめに
Railsで運用されているAPIサーバーのシリアライザとSwaggerスキーマをリファクタリングした話と、そこで当たった問題(余談)の紹介です。
## 現状の状態
社内のサービスはAPIサーバーとしてRailsを用いて運用されているのですが、長く運用されているため、手動で作成されるSwaggerスキーマとそれに対応したシリアライザが無秩序な状態にあり、新規APIの実装や修正が入るたびに各人の裁量でスキーマおよびシリアライザを使用・作成していて、運用しづらくなっていました。また、ActiveModel::Serializerなどは使っていなく、独自で実装を行なっています。
実際にどのような構成になっていたかの例を大雑把に。
### 例
例えば、以下のようなモデルがあったとして
“`Ruby
class Member < ActiveRecord::Migration def change create_table :members do |t| t.string :user_name t.string
controllerのインスタンス変数をなんでviewでも使えるの?
## はじめに
Railsでは“`controller“`で定義したインスタンス変数を“`view“`側で使うことができますが、最近、ふと「これなんで?」と思ったのでrailsの中身を見てみようと思います。## コードリーディング
作成される“`controller“`は“`ApplicationController“`を継承していて、“`ApplicationController“`は“`ActionController::Base“`を継承しているので、“`ActionController::Base“`を見にいきます。“`actionpack/lib/action_controller/base.rb
# == Renders
#
# Action Controller sends content to the user by using one of five rendering methods. The most versatile and common is the rendering
# of a template. In
Stimulus リファレンス: ライフサイクルコールバック
:::note
この記事は[Google翻訳](https://translate.google.co.jp/)の結果を編集したものです。
:::https://stimulus.hotwired.dev/reference/lifecycle-callbacks
ライフサイクルコールバックと呼ばれる特別なメソッドを使用すると、コントローラーまたは特定のターゲットがドキュメントに接続したり、ドキュメントから切断したりするたびに応答できます。
“`javascript
import { Controller } from “@hotwired/stimulus”export default class extends Controller {
connect() {
// …
}
}
“`# メソッド
| メソッド | Stimulusによる呼び出し |
| :– | :– |
| initialize() | コントローラーが最初にインスタンス化されたときに1回 |
| [name]TargetConnected(target: Element
Rails のフロントエンドツールに vite_rails を使う
Rails7からフロントエンドで使えるツールのオプションが増えました。jsのデフォルトは`importmap-rails`、モジュールバンドラーを使いたい場合は`jsbundling-rails`で`webpack`, `esbuild`, `rollup`が選べます。
ビルドが早いと言われている`esbuild`を使うのも良いですが、まだ開発中の機能もあります。
開発環境は高速化して、安定して本番ビルドできるツールを探したところ`vite_rails`が良さそうでしたので試してみました。## vite_rails とは
ビルドツール Vite を Rails に最適化したライブラリです。基本的に Webpacker でできることは網羅しています。
### 特徴
– エントリーポイントを自動検出
– `app/frontend/entorypoints`以下のファイルを自動で検出してビルドします。
– 高速なHMR(Hot Module Replacement)ができる
– 事前ビルドに`esbuild`を使っている
– `assets:precompile
【Rails6】レビューの平均値をレーダーチャートで表示する方法(gon、chartkick、chart.js)
# 概要
* Userが5段階評価ができる5つの項目のレビューを行うと、それぞれの平均値がレーダーチャートとなってトップビューに表示される実装を行ったので、その手順を記す。5段階評価機能については、別記事でまとめています。
* [【Rails6】5段階評価の星レビュー機能を実装する手順(raty.js)](https://qiita.com/Ryo-0131/items/63e81b13b9382690bee4)# 前提
* 今回の実装においては、chart.jsとchartkick.js両方を利用する。利用先は以下の通り。
* トップビュー(/index):chartkick.jsでバーチャート表示
* 詳細ページ(/show):chart.jsでレーダーチャート表示
* JSとrailsの連携は、gem gonを利用する。(chartkick.jsはrails内で完結)# データベース設計
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/
同じpage内でStimulus 同一のcontrollerを何度も利用したいとき
# 概要
PF用にアプリを個人開発しているRailsしか知らない素人です。親愛なるDHHが提供するHotwireを完全に理解した までも行きついていません。何もかもが霧の中、私はどこにいるのか…
その Hotwireに含まれる必要十分なJSパッケージ、 Stimulusのcontrollerを同じページ内で何度も使用する状況の際、なんかうまくいかないなぁ?、ハマったなぁ?、ということがあったのですが、とても単純なことで解決できたので、Stimulusはいいぞ?、もっと流行ってくれというご祈祷として記事を作成します。## 環境
この記事作成当時の一番
“`Gemfiles.rb
# 抜粋です
gem ‘stimulus-rails’, ‘~>1.2.1’
“`## やりたかったこと
タイトルの通り、同一page内で同じstimulus controllerを何度も利用したい。## 結論
使う場所ごとに個別にcontrollerを宣言してその中でtargetやactionを記載すればうまくいきました。## 経緯
pageの先頭や`application.html.er
Railsの「開発」環境へのデプロイ
### 想定した環境
タイトルの「開発」環境と言っている部分の想定は、
– 何らかのCI/CD環境を用いRailsアプリをクラウドなりオンプレの実環境へデプロイをする
– 一般的な「開発/dev/development」→「ステージング/stg/staging」→「運用/prd/prod/production」といった環境の流れを想定
– この「開発」用途の環境であり、デプロイするたびにデータベース丸ごと壊し初期化して良い、というかしたい
– `RAILS_ENV`の`development`/`production`とは別の話、「開発」環境だけど`RAILS_ENV=production`である
– そして初期化されたクリーンな状態で動作テストをしていく
– 「運用」用途でデータベースの内容を維持していくものは対象にしてはいない### データベースを破壊すのに困ること
まず初期化だがrailsのコマンドで行おうとすると`rails db:reset`になると思う。そして、これを阻む諸々がある。
#### データベース破壊保護
そもそも`RAILS_ENV=product
RailsでWebアプリを作成する際に導入して良かった設計やgem
Rails で Web アプリを作成・運用していく中で、個人的に導入して良かった設計や gem を紹介していきます。
なお、本記事では特定のユースケースに絞った話ではなく、比較的どの Rails アプリでも利用できるような内容を書いていければと思いますので、参考になれば幸いです。## Form オブジェクト
基本的には Rails Way、MVC と Rails 標準機能に沿った設計でシンプルに保つようにしてますが、Form オブジェクトについては導入しています。
特定のユースケースの処理(ビジネスロジック)をモデルから分割する目的で使用し、今回は自分がよく利用する ActiveRecord モデルを継承する方法を紹介します。
下記のようなイメージになります。“`ruby:app/models/user.rb
class User < ApplicationRecord ... end ``` ```ruby:app/forms/user_registration_form.rb class UserRegistrationForm < User # モデ
【Rspec】レシーバーの「FactoryBot」の記述を省略する設定
## FactoryBotの記述を省略し、よりコードをすっきりさせる
インスタンスを作成する記述のたびにFactoryBotを書く手間を減らし、よりコードをすっきりさせていきます。
“`ruby
user = FactoryBot.build(:user, fullname: “”)
“`
# spec/rails_helper.rbに省略する記述を追加
“`ruby:spec/rails_helper.rb
RSpec.configure do |config|
:
#下記の記述を追加
config.include FactoryBot::Syntax::Methods
:
end
“`# 設定後
書く手間が減り、よりコードをすっきりさせることができました。
“`ruby
user = FactoryBot.build(:user, fullname: “”)
↓
user = build(:user, fullname: “”)
“`
RSpecでtravel_toを使ってみた
## はじめに
ポートフォリオの作成で初めてtravel_toを使ったので記事にしました。## タイムゾーンを変更する
時間の変化を分かりやすくするため、タイムゾーンを日本に設定します。
“`ruby: config/application.rb
class Application < Rails::Application config.time_zone = 'Tokyo' end ``` ## travel_to putsで時間を表示させると、タイムスタンプが変わっていることが分かります。 ```ruby: spec/system/posts_spec.rb describe 'travel_toを使ってみた' do it '24時間前、現在、24時間後' do travel_to Time.zone.now.yesterday do puts Time.zone.now end puts Time.zone.now travel_to Time.zone.now.tomorrow do
【Rspec】FactoryBotとは
# FacroryBotとは
Rspecでテストを行う際にテストデータの作成をサポートするGemです。
Gemfileで`group :test do ~ end`の箇所に`gem “factory_bot_rails”`記述し使用します。
FacroryBotを使用するには`spec/factories/モデル名.rb`といった形でファイルを作成します。# 例
今回は仮にUserモデルを例にして作成します。
“`
% rails g factory_bot:model user(モデル名)
“`
gemのインストールができたら上記のコマンド入力することで`spec/factories/users.rb`が作成され以下の雛形が出来上がっています。
“`ruby:spec/factories/users.rb
FactoryBot.define do
factory :user doend
end
“`
今回は名前とメールアドレスのダミーデータを作成する例として、テストコードを一つずつ見ていきましょう。
“`ruby:spec/factories/users.r
Ruby on Rails のバリデーション
## はじめに
株式会社ピー・アール・オーのアドベントカレンダー18日目を書きます。
個人的にRuby on Railsに触れる機会があったのでRailsのバリデーションについて書きたいと思います。
ちなみに弊社ではRubyの案件は自分の知る限りほとんどありません。PHP、Javaの案件が多い印象です。だいぶ遅まきで、勉強し始めているのですがRails初学者の私からするとRailsのコードを見たときの第一印象は**コード量が少ない**でした。
コード量が少ないということは保守性に優れたコードであるということなのですが、
Railsを何も知らない人からすると逆にこれってどうやって動いてるの?となってしまうわけです。
新しく触れるフレームワークでは、いつもあることでお作法をよく理解することが一番だと思います。お作法を理解するには先ずはRailsガイドよく読むのがよさそうでした。
ガイドを読んでいる中で割と最初の方に出てくるバリデーションの章が印象に残っているのでいくつか紹介したいと思います。
https://railsguides.jp/active_record_valida
railsコマンドまとめ[備忘録:随時追加予定]
コントローラの自動生成
“`
rails generate controller コントローラ名 アクション名
rails generate controller StaticPages index help
“`作成したコントローラの削除
“`
rails destroy controller コントローラ名 アクション名
rails destroy controller StaticPages index help
“`モデルの自動生成
“`
rails generate model モデル名 データ名:データ型
rails generate model User name:string email:string
“`作成したモデルの削除
“`
rails destory model モデル名 データ名:データ型
rails destory model User name:string email:string
“`データベースのマイグレーションを変更
renderでのデプロイに失敗した
# 取り組んでいたこと
アプリケーションをrenderにデプロイしたときにエラーが出たときのことを書きます。
このアプリは初めはAWSでデプロイする作業をしていましたが、
作業途中で、都合によりrenderにデプロイするという方向転換をしています。# エラーの内容
※renderを登録したときにGithubと連携をしています。
GitHubからRenderにコードが自動的にプルされ、デプロイが実行されます。Githubでコミット・プッシュをすると自動でデプロイ作業が行われます。
しばらく待つと、
![a63816b1e031aa0968a0694f0dd998cf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2845625/062204b3-5d72-62dc-399d-a1e2cda70831.png)
failed…つまり失敗しましたよと表示されました。# 解消するために行ったこと
何が原因か調べるために、エラーログを確認します。赤い雲マークの横のDeployをクリックする
Railsで必要十分なAPI開発環境を整える(Docker + Rails + MySQL + OpenAPI + CircleCI)
# はじめに
RailsでAPIを作るぞ!ってなった時にいつも行っているテストやリンターなどの導入手順を備忘録がてら記事にしました。
また、本記事ではRailsアプリケーション自体は最小限の構成で作成し、
なるべく小規模かつ開発に必要なツールは最低限導入しておくことを念頭においています。# 完成系
最初に完成系のrepositoryを上げておきます。
実際の実装が見たい場合は下記repositoryをご参照ください。https://github.com/sho-19202325/minimal_app
# 本記事で扱うこと
– dockerでmysqlをdbとする最小限のrailsアプリケーションを作成
– ヘルスチェック用endpointの実装
– テストツール(rspec)の導入
– リンターツール(rubocop)の導入
– API定義書、並びに関連ツール(OpenAPI, Swagger Editor, Swagger UI, committee)の導入
– CI(CircleCI)の導入
– CORSの設定
– JSON用テンプレートエンジン(jbuilde
【悪戦苦闘】自社開発企業に入社してからの一年を振り返り、エンジニアに必要な要素を考える
# はじめに
どうもこんにちはもきお([@mokio_50](https://twitter.com/mokio_50))です。早いもので未経験からエンジニア転職し1年が経ちました。なので今回は自社開発企業に入社してからの1年間を振り返り、エンジニアに必要な要素って何なのかを考えていきたいと思います。
自分自身の振り返りと自社開発企業での働く風景がどんなもんなのか少しでも感じてもらえたら幸いです。結構なボリュームになっているので何回かに分けて読んでいただいた方がいいかもしれません。
# 簡単な企業概要
イメージを持ってもらうために弊社のフワッとした企業概要を記載しておきます。
* 従業員200名前後
* 自社サービス4つ稼働中、来月より新サービス開発予定(Rails, React, TypeScript)
* 既存サービス:バックエンドRails、フロントHTML、CSS、JS、一部React
* データ分析でPython使用
* かなりDBのレコード数が多く検索が重くなるため、ところどこでElasticsearch使用# 1年間に完了したタスク数
まず1年間にこなしたタス
SessionとCookie
## はじめに
Railsでは“`devise“`という、それはそれは便利な認証機能用の“`gem“`がありまして、それに頼り切ってしまっていたため“`cookie“`がどうとか“`session“`がどうとかという根本的な理解ができていませんでした。
それが最近バレてしまったので、この機会に“`session“`と“`cookie“`についてまとめたいと思います。## Cookie
“`cookie“`は、ステートレスな“`HTTPプロトコル“`をステートフルにすることができる代物です。元来、HTTPリクエストはステートレスであるため、前後のリクエストとの関係を持つことはなく独立したものです。
なので、1つ前のリクエストの内容を引き継ぐみたいなことができません。これを解決するのが“`cookie“`です。
サーバーはリクエストがあると、以後同じ相手からのリクエストを特定するために“`set-cookie“`ヘッダーを付与してレスポンスを返します。
その後のリクエストでは、その“`set-cookie“`ヘッダーに指定された値を`
Stimulus リファレンス: コントローラー
:::note
この記事は[Google翻訳](https://translate.google.co.jp/)の結果を編集したものです。
:::https://stimulus.hotwired.dev/reference/controllers
コントローラーはStimulusアプリケーションの基本的な組織単位です。
“`javascript
import { Controller } from “@hotwired/stimulus”export default class extends Controller {
// …
}
“`コントローラーはアプリケーションで定義するJavaScriptクラスのインスタンスです。各コントローラークラスは`@hotwired/stimulus`モジュールによってエクスポートされた`Contoller`基底クラスを継承します。
# プロパティ
すべてのコントローラーはStimulusアプリケーションインスタンスに属し、HTML要素に関連付けられています。 コントローラークラス内ではコントローラーの以下にアクセスでき