- 1. 【Rails API】エラーハンドリング処理をJSON形式で返す
- 2. ngrokを用いたローカル開発環境の公開方法
- 3. Railsアプリケーションの環境変数を確認する方法
- 4. 【rails】ストロングパラメータでmergeメソッドを使う
- 5. Rails, Sidekiq, RedisをDockerでセットアップし、指定した時間にジョブを実行する
- 6. React、RailsのActive StorageでAWS S3を使おう!
- 7. Rails7(esbuild + Tailwind + MySQL)をDocker Composeで環境構築する
- 8. 共同開発 model作成 カラム追加
- 9. Next.jsとRuby on Railsを使ってアプリを作成してみた【フルスタックブログ】
- 10. 【Rails】人間が読める形式でメールの件名と本文をログに出力する方法 (Beta)
- 11. 誹謗中傷が機能しないSNSを個人開発してみました!「紹介編」| Rails7 x TailwindCSS x Render.com
- 12. 【Rails】DecoratorとHelperの特徴・違い
- 13. Rubymineの2023.1.xでdebugできない問題の対応
- 14. いいコード悪いコードまとめ3章クラス設計
- 15. 【Rails】投稿のソート機能(kaminari)
- 16. いいコード悪いコードまとめ2章設計の初歩
- 17. OpenAPIを業務で一から書いてみた時の反省
- 18. Railsのクエリ文字とparams
- 19. Railsアプリ作成の上で大まかな進め方
- 20. コミットの直前にrubocopを自動実行する
【Rails API】エラーハンドリング処理をJSON形式で返す
Rails APIについて学習しています。
今回は、Railsアプリケーションを使い、をAPIによる例外処理(エラーハンドリング)を実装していきます。# 今回やること
– apiのエラーハンドリング処理を実装する。
– 404, 500のレスポンスを返す処理を実装する。
– apiのエラーをjson形式で返す処理を実装する。# base_controller.rbに追記する
“`ruby:app/controllers/api/v1/base_controller.rb
module Api
module V1
class BaseController < ApplicationController include Api::ExceptionHandler end end end ``` # このコードの解説 - このコードでは、Ruby on Railsのアプリケーションにおけるコントローラの基底クラス`BaseController`を定義している。 - `module Api` `module V1`の部分で、「Api」
ngrokを用いたローカル開発環境の公開方法
## はじめに
Rails 7 で `LINE Messaging API`を取り入れたオリジナルプロダクト(ポートフォリオ)の作成中、メッセージの送信テストを行うために公開されたURLが必要になりました。
[ngrok](https://ngrok.com) で簡単に実現できたのでまとめました。### 開発環境
– OS:macOS Ventura 13.2.1
– Ruby:3.2.2
– Rails:7.0.6
– Homebrew 4.0.28## ngrokについて
### ngrokとは
読み方:エン・グロック
開発中のローカルサーバーをインターネット上に一時的に公開するためのツール。**無料版**あり!
ローカルホストで動作しているWebアプリケーションやAPIなどを、インターネット上からアクセス可能な状態にすることができます。もう少し具体的に言うと、`ngrok`は安全なトンネルを作成し、そのトンネルを通じて公開URL(ngrokが提供)からローカルホストへの接続を可能にします。
トンネル:ネットワーク間を接続する安全な通り道のこと。ここでいう「ト
Railsアプリケーションの環境変数を確認する方法
## 手順
### 1. rails console を起動
“`shell_session
$ rails console
“`### 2. ENV オブジェクトを確認
“`irb
# キーを指定して表示
irb(main):005:0> ENV[‘RAILS_ENV’]
=> “development”
“`“`irb
# 全て表示
irb(main):001:0> ENV
=>
{“BUNDLER_ORIG_BUNDLER_VERSION”=>”BUNDLER_ENVIRONMENT_PRESERVER_INTENTIONALLY_NIL”,
“BUNDLER_ORIG_BUNDLE_BIN_PATH”=>”BUNDLER_ENVIRONMENT_PRESERVER_INTENTIONALLY_NIL”,
“BUNDLER_ORIG_BUNDLE_GEMFILE”=>”BUNDLER_ENVIRONMENT_PRESERVER_INTENTIONALLY_NIL”,
“BUNDLER_ORIG_GEM_HOME”=>”BUNDLER_ENVIRONMENT
【rails】ストロングパラメータでmergeメソッドを使う
## RealWorldでエンドポイントを作る
RealWorld という OSS のプロジェクトがある。
RealWorld は実世界と同じ機能を持つプラットフォームを作ることで、学習したいフレームワークの技術を習得することを目的としたプロジェクトのこと。[RealWorld](https://realworld-docs.netlify.app/docs/specs/backend-specs/api-response-format#single-article )
詳細はリンク先をご覧いただきたいが、
エンドポイントの作成で、次のようなJSONデータを指定URLにPOSTした場合、`POST /api/articles`
“`
{
“article”: {
“title”: “How to train your dragon”,
“description”: “Ever wonder how?”,
“body”: “You have to believe”
}
}
“`
次のようなJSONデータを返すコードを作成するよう指示されてい
Rails, Sidekiq, RedisをDockerでセットアップし、指定した時間にジョブを実行する
## はじめに
この記事では、Dockerを使用してRails、Sidekiq、Redisをセットアップし、指定した時間にジョブを実行する方法を紹介する。今回は、ユーザーにリマインダーメールを送信する機能を例とする。## Sidekiqとは
SidekiqはRubyのバックグラウンドジョブ処理ライブラリで、非同期処理を行うために使用される。Redisをバックエンドとして作成したジョブを管理する。#### 非同期処理とは
プログラムが複数のタスクを並行して実行すること。重い処理や時間のかかる処理をバックグラウンドで行うことでパフォーマンスを向上させることができる。
メールの送信やデータのバッチ処理など、時間のかかるタスクを非同期に行うことが一般的。## DockerとDocker Composeの設定
まず、DockerとDocker Composeを使用して、Rails、MySQL、Redis、Sidekiqの各サービスをセットアップをする。以下のDockerfileとdocker-compose.ymlをプロジェクトのルートディレクトリに作成する。“`Dockerf
React、RailsのActive StorageでAWS S3を使おう!
## Actvie Storageとは?
Rails5.2から追加されたRailsのストレージ機能です。AWS S3、Google Cloud Storageなどのクラウドストレージサービスにアップロードするのに便利らしいです。
Railsで画像などをアップロードする機能としてCarrier Waveも候補になるかと思います。
:::note info
**viewをReactやVueで書く場合はCarrier Waveを使った方がいいかも?**
[ActiveStorage vs CarrierWave – Qiita](https://qiita.com/w5966qzh/items/510d4c2a3829524b2e64)
:::しかし、普段Active Storageを使っていたり、SPAでも使用したい人は多いと思いますので私の勉強も含めて、AWS S3のセットアップから行っていきたいと思います。
そこまでrailsやAWSに詳しくないので動いたコードを共有します。セキュリティやコードに改善点があればご指摘お願いします。
## 1.AWSのセットアップ
1.
Rails7(esbuild + Tailwind + MySQL)をDocker Composeで環境構築する
[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。
Rails7の環境構築でesbuild,Tailwind, MySQLでの構成の際に、Docker Composeで環境構築する際にハマったところなどをまとめておきました。
# 前提条件
– M1 Mac
– Ruby v3.2(RailsのDockerコンテナの中でのバージョン)
– Rails v7.0.5(RailsのDockerコンテナの中でのバージョン)
– Node v18.16.1(RailsのDockerコンテナの中でのバージョン)
– MySQL v8.0(MySQLコンテナの中でのバージョン)# Docker Composeを実行する前に作成・変更が必要なファイル
## entrypoint.sh
以下の記述で作成します。“`sh:entrypoint.sh
#!/bin/bash
set -e# Re
共同開発 model作成 カラム追加
モデルの作成は 先頭大文字の単数形で作成します。
### :shamrock:モデルの作成とカラムの追加“`
【顧客用】
$ rails g devise Customer
【管理者用】
$ rails g devise Admin
“`
“`
rails db:migrate
“`
Deviseというユーザー認証システム用のCustomerモデルが生成されます。モデルファイル、ビューファイル、データベースマイグレーションなど、Deviseを使うために必要なファイルが自動的に作成されます。:star: cusutomers (顧客)ファイル
“`diff_ruby
create_table :customers do |t|
t.string :last_name, null: false
t.string :first_name, null: false
t.string :kana_last_name, null: false
t.string :kana_first_name, null: false
Next.jsとRuby on Railsを使ってアプリを作成してみた【フルスタックブログ】
## 参考サイト
[Next.jsとRuby on Railsを使ってフルスタックブログ開発を体験してみよう](https://www.youtube.com/watch?v=XQtkP8it9Ag&t=1657s)
【Rails】人間が読める形式でメールの件名と本文をログに出力する方法 (Beta)
## 困っていること
ActionMailerからメールを送信すると、ログにメールの送信内容が出力されます。しかし、件名(Subject)や本文はエンコードされていて、内容が確認できません。
“`
Devise::Mailer#reset_password_instructions: processed outbound mail in 11.8ms
Delivered mail 64b379aa26c5c_60f3440c-546@jit-m1.local.mail (3.4ms)
Date: Sun, 16 Jul 2023 14:01:30 +0900
From: please-change-me-at-config-initializers-devise@example.com
Reply-To: please-change-me-at-config-initializers-devise@example.com
To: foo@example.com
Message-ID: <64b379aa26c5c_60f3440c-546@jit-m1.local.mail>
S
誹謗中傷が機能しないSNSを個人開発してみました!「紹介編」| Rails7 x TailwindCSS x Render.com
注:本記事はzennの記事からの転載です。
## 概要
昨今、SNSを通じた誹謗中傷が起こっていますが、それらをどうにか起こさないSNSができないものかと思い自分なりに考え、業務未経験ですが作ってみました!今回は、その簡単な紹介記事です。良ければ読んでみて、そして遊んでみてください!また、意見ももらえるととても嬉しいです!## 使用技術
– Ruby 3.1.2
– Rails 7.0.6
– 各種Gem (ログインなど)
– Tailwind CSS (デザイン周り)
– PostgreSQL (DB)
– Render.com (デプロイ先)## 作ったもの
![コトノハ 手紙制作画面](https://storage.googleapis.com/zenn-user-upload/06cc60b20874-20230715.png)https://gen3-kotonoha.onrender.com/
“コトノハ”というwebアプリを作りました。## 特徴
未熟な私ではありますが、コトノハでは主に機能面で差別化を測っています。既存のアプリ・サービスとは違う点を、表
【Rails】DecoratorとHelperの特徴・違い
# Decoratorとは?
– デザインパターンの一つである。
– デザインパターンとは、汎用的な設計パターンのことで、いろんなプログラムで再利用できるのが特徴。
– Decoratorはインスタンスに対して動作するため、各インスタンスに固有の挙動を持たせることができる。
– draperというgem(ライブラリ)やActive_Decoratorを用いることで使用できる。# Decoratorの使用例
– モデルとビュー、どちらにも記述できるロジックがある場合に、あいだにDecoratorを定義する事で、モデルをスリムにできる。
– つまり、Fatモデルの解消などの効果がある。
– 例えば、日付フォーマットを変更するロジックを実装する際などに利用できる。
– モデル・ビュー、どちらにも記述することは可能だが、Decoratorを間に定義し、役割を分散させることでコードをスッキリできる。詳しいコードはこちらの記事が参考になります。
【Rails入門】ViewとModelの間にDecor
Rubymineの2023.1.xでdebugできない問題の対応
## 背景
Rubymineのバージョンを2023.1.xに上げて、Rubymin上でデバッグを実行しようとすると、debug用gemが入っていないというエラーが繰り返し表示される。
指示に従いインストールしても何もおきない。
既にリリースされてから、数ヶ月経っていますが、日本語での情報があまりなかったので、書いてみました。## 環境
macOS 13.4(intel, m1)
ubuntu 22.04LTS
docker
Gemfileにdebaseとruby-debug-ideが入っている
## 原因
Gemfileにdebaseとruby-debug-ideを記載していると起きる模様
直接的な原因は深く調べきれていないのでご容赦ください。## 対応策
### その1
rubymineのバージョンを旧バージョンに戻す
元も子もないですが、以前のバージョンで動いていた方は、旧バージョンに戻したら問題ないです。https://www.jetbrains.com/ja-jp/ruby/download/other
いいコード悪いコードまとめ3章クラス設計
原則:クラスが単体で正常動作するよう設計する
これはSOLID原則のSingleResponsibilityの考え方かな?https://qiita.com/YokoYokoko/items/347101166fb81d301c45
「クラス設計とはインスタンス変数を不正状態に陥らせないための仕組みづくり」である。
クラスをインスタンス化して、それを他のクラスに初期化してもらったり、データの入力をチェックしてもらうようではいけないわけで、クラスは必ず自分の身は自分で守ると言う自己防衛責務を全てのクラスがそなえるわけです。
## コンストラクタで確実に正常値を設定する
これを避けるために2章でも出てきましたが、コンストラクタで初期化することが大切です。例えば、`Money`クラスを作成するときの基本形は以下のような形ですが、これは問題があります。
なぜなら、引数に不正な値が渡ってきてもエラーが発生しないからです。
“`
class Money
attr_accessor :mount, :currencydef initialize(mount, cur
【Rails】投稿のソート機能(kaminari)
投稿の表示順を変えるソート機能を実装したのでまとめておきます。
完成するとこんな感じです。
[![Image from Gyazo](https://i.gyazo.com/c68701c41d8fa158beb4b963a2d9316a.gif)](https://gyazo.com/c68701c41d8fa158beb4b963a2d9316a)# kaminariをインストール
gemファイルに記載しbundle install
“`
gem ‘kaminari’
“`# モデル
“`ruby
scope :latest, -> {order(created_at: :desc)} #新しい順
scope :old, -> {order(created_at: :asc)} #古い順
scope :random, -> { order(‘RAND()’) } #ランダム
“`# コントローラー
“`ruby
def index
@posts = Post.all
if params[:latest]
@posts = Pos
いいコード悪いコードまとめ2章設計の初歩
## 省略せずに意図が伝わる名前を設計
“`
player #pとか書いちゃうと自分は分かるかもしないが、他の人は分からない。
damage #dも同様状況によってはplayerやdamageだけでは分からないので、読み手が理解しやすい配慮をする。
“`## 変数を使い回さない、目的ごとの変数を用意する
以下のように`damage`という変数を使い回して、再代入するのはNG
“`
damage = player_attack
damage = damage – something
“`## 意味のあるまとまりでメソッド化する
以下のような記述が1つのメソッドに混在していると可読性や保守性においてよろしくない。
したがって、意味のあるまとまりでメソッド化することが重要
“`
プレイヤーの攻撃力を合算する
敵の防御力を合算する
ダメージ量を評価する
“`## 関係しあうデータとロジックをクラスにまとめる
いろいろなところにメソッドを書いていると可読性が落ちてしまう。そのため、関連し合うデータやロジックは1つのクラスにまとめること。また、クラス化するときに重要
OpenAPIを業務で一から書いてみた時の反省
RailsをAPIとして利用する際のAPIドキュメントを業務で作成したのだが、思っていたより時間が掛かったので反省も含め書いていく。
—
### 1.色々調べてみた
最初、1から書くのは億劫だし楽に書く方法を調べたところ、GemにRspecから生成する方法があることを知り試してみた。https://qiita.com/noguri/items/4d60b7bf509bf90b3425
それっぽいものは直ぐに生成されたから便利ではあったが、Rspecが全てのControllerで書かれている訳ではなかったので、書かれてないControllerを探したりで時間が掛かってしまった。(素直に急がば回れをするべきだった。反省。)
—
### 2. 書いてはみたものの…
その後、あまり理解もしてないままOpenAPIの記法に従ってymlを書いていくが、理解してないため遭遇するエラーの解決速度が如何せん遅い。
この手のものは、全体から細部に書くべきだが、Pathを列挙することもなくただひたすら上から順々に書いてしまった。
“`yml
### 今回のよくない進め方の例
Railsのクエリ文字とparams
今まで漠然と理解していたが整理のため記載
クエリパラメーター
“`ruby
http://example.com/line/latest_message?user_list=U2525
“`paramsのkeyであるuser_listにはU2525が入る
“`ruby
class Line::LatestMessageController < ApplicationController def index params[:user_list]) #params[:user_list] == U2525 end end ``` またinputタグのname属性の文字がURLのqueryのkeyになる ```html
“`
Railsアプリ作成の上で大まかな進め方
# DBの構造を考える
1.DBの基盤となるテーブルを考える
どんなテーブル構造にするか?また、そのためにはどんなカラムの追加が必要か?(例:name,emailなど)
内容がまとまったら、まず`rails db:create`でデータベース自体を作成します。ただし、この段階ではまだテーブルは作成されていません。2.モデルを作る(命名規則は***最初の文字が大文字の単数形***)
基本構文は以下の通りです。
`rails g model モデル名 カラム名:データ型`
例えば以下のようになります。
`rails g model Content name:string email:string`
rails g modelを実行するとモデルと同時にマイグレーションファイルも生成されます。なのでrails g migrationは実行不要です。もし、先にマイグレーションファイルを作成してしまったら
`rails g model モデル名 –skip-migration`でmodelだけを作成し、マイグレーションファイルは作成しないようにしてください3.rai
コミットの直前にrubocopを自動実行する
Railsアプリケーションの開発において、「よしできた、git push!」したあと、GithubでPRをみるとCIでバツマークがついていた。チェック結果をみたらrubocopでフォーマットエラーを吐いていた・・なんて経験はありませんか? 私はあります。
これを解決する方法が実はありました。
## 前提とする読者
– Railsでアプリケーションを開発している人
– CI環境が整っていて、rubocopを使っている人## 簡単な方法
gitコマンドでは、フックという仕組みがあり、git commitコマンドの直前に自前のプログラムを実行させることができます。開発中のディレクトリの中に、`.git/hooks` というディレクトリがあるはずです。
`.git/hooks/pre-commit` というファイルを準備して、そのなかで“`
bundle exec rubocop -a
“`を書いておきます。
(コミットの前に `.git/hooks/pre-commit` ファイルがそのまま実行されるので、`chmod +x .git/hooks/pre-commit`