- 1. Rails + curl – POST送信したファイルの中身を取得する例 ( ActionDispatch )
- 2. クラスの関連付け
- 3. パーシャルにローカル変数を渡す
- 4. パーシャルを使ってヘッダーやフッターを共通化する
- 5. ぼっち演算子とnil?、blank?を組み合わせるとnilのときに結果が逆になる罠
- 6. 【Rails】郵便番号による住所検索機能を作る ※ gem 無し
- 7. Deviseの日本語化
- 8. Render.com(無料枠) データベースの使い分け
- 9. 【Vuex4 + Vue3 + Rails7】JWTとVuexを使ってトークンベースのログイン機能を実装する
- 10. Rails 資料一覧
- 11. seed_fuのseedメソッドの引数を活用すれば、似たデータが重複して新規作成されることもないし、idをわざわざ書く必要もないぞと気づいた
- 12. indexメソッド
- 13. 【Rails】UUIDをプライマリーキーにする
- 14. Ruby scanメソッド
- 15. Ruby if, elseを使ったプログラム
- 16. rendering_optionsが見つからない時の対処方法:Rails 7 + Devise + Turbo
- 17. AWS ECS + Rails + MySQL(Aurora) – 同じセキュリティグループに ECサービスとRDSを作成して RailsからDBアクセス可能にする
- 18. 【Rails】部分テンプレートをアクションごとに挙動を変えたいときはcontroller.action_nameが便利
- 19. 【Rails】モデルのカラムで選択肢を指定したいときはenumerize gemを使おう
- 20. docker-composeを使ってdocker化する方法(rails6×My SQL)
Rails + curl – POST送信したファイルの中身を取得する例 ( ActionDispatch )
# curl コマンドの例
任意のキー ( ここではfoo ) に対してファイルパスを指定してPOSTする
“`
curl -X POST http://localhost/file -F foo=@/path/to/file
“`# Rails Controller
paramsのキーにActionDispatchのインスタンスが関連付けられるので read すればファイル内容が得られる
“`rb
class FileController < ApplicationController def create params[:foo] # ActionDispatchのインスタンス params[:foo].read # ファイルの中身 end end ``` # チャットメンバー募集 何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。 https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ # Twitter https://twitt
クラスの関連付け
# 2.1 belongs_to関連付け
あるモデルでbelongs_to関連付けを行なうと、“`他方のモデルとの間に「1対1」のつながり“`が設定されます。このとき、宣言を行ったモデルのすべてのインスタンスは、“`他方のモデルのインスタンスに文字どおり「従属(belongs to)」“`します。
たとえば、Railsアプリケーションに著者(Author)と書籍(Book)情報が含まれており、書籍1冊につき正確に1人の著者を割り当てたいのであれば、Bookモデルで以下のように宣言します。
“`rb
class Book < ApplicationRecord belongs_to :author end ``` . . . ```belongs_toを単独で利用すると、一方向のみの「1対1」つながり```が生成されます。 つまり上の例で言うと、「個別の書籍はその著者を知っている」状態になりますが、「著者は自分の書籍について知らない」状態になります。 ```双方向関連付けをセットアップするには、belongs_to関連付けを使うときに相手側のモデルにhas_oneまたはh
パーシャルにローカル変数を渡す
# はじめに
Railsなどを中心に勉強中のエンジニア初心者が他の記事を参考にしたり、実際に実装してみたりして、アウトプットの一環としてまとめたものです。
間違っていることもあると思われるので、その際は指摘いただけると幸いです。# パーシャル呼び出し時に変数を渡す
パーシャルを呼び出す際に使用する変数を以下のようにして渡すことができる。
下記の基本形の記述は、「インスタンス変数`@product`を、パーシャル内のローカル変数`product`として渡す」という意味。
これによりパーシャル内ではローカル変数「`product`」を利用することができる。
### パーシャル呼び出し時の記述
“`ruby
# 基本形
<%= render 'title', locals: { product: @product } %># 短縮系で記載する
<%= render 'title', product: @product %>“`
# 呼び出されたパーシャル内ではローカル変数を使用する
パーシャルにローカル変数を渡さず、直接インスタンス変数を参照することもできる。
パーシャルを使ってヘッダーやフッターを共通化する
# はじめに
Railsなどを中心に勉強中のエンジニア初心者が他の記事を参考にしたり、実際に実装してみたりして、アウトプットの一環としてまとめたものです。
間違っていることもあると思われるので、その際は指摘いただけると幸いです。# パーシャルを使う
パーシャル(部分テンプレート)は、レンダリング処理を扱いやすい単位に分割する仕組み。
パーシャルを使うとレスポンスで表示するページの特定部分をレンダリングするコートを別ファイルに切り出すことができる。
### パーシャルを呼び出す
パーシャルをビューの一部としてレンダリングするには、`render`メソッドを使う。
以下の例では、`_test.html.erb`というファイルをレンダリングする。
> パーシャルファイルはファイル名の冒頭にアンダースコアが付いていて、他のビューファイルと区別される
>“`ruby
# _test.html.erbというファイルをレンダリングする
<%= render "test" %>
“`下記の場合は、_test.html.erbという名前のファイルをレンダリングする。
##
ぼっち演算子とnil?、blank?を組み合わせるとnilのときに結果が逆になる罠
考えてみればそのとおりだけども、ちょっとハマったのでメモがてら。
ぼっち演算子については[safe navigation operator (ぼっち演算子)](https://docs.ruby-lang.org/ja/latest/doc/news=2f2_3_0.html)を参照。
rubyのぼっち演算子が便利なのでよく使うのですが、
条件分岐させるときに注意が必要です。“`ruby
# hogeはnameというインスタンス変数を持つオブジェクトとします
hoge.name.blank? ? ‘空です’ : ‘空じゃないです’
“`みたいな判定のときに
“`ruby
hoge.name = ‘値あり’
hoge.name&.blank? ? ‘空です’ : ‘空じゃないです’
#=> ‘空じゃないです’hoge.name = ”
hoge.name&.blank? ? ‘空です’ : ‘空じゃないです’
#=> ‘空です’hoge.name = nil
hoge.name&.blank? ? ‘空です’ : ‘空じゃないです’
#=> ‘空じゃな
【Rails】郵便番号による住所検索機能を作る ※ gem 無し
## 概要
巷でよく見かける「郵便番号を入力すると該当の住所が番地以前まで自動で入力される」といった機能を Rails で作ってみました。
こういった記事はすでに世の中に溢れていますが、JQurey やら gem やらを使ったものが多く、個人的にはもっとシンプルな実装にしたかったため今回備忘録として残します。
## 下準備
※ Rails の環境構築はすでに済んでいるものとして話を進めます。
– Address モデルの作成
– Prefecture モデルの作成住所に関する各種情報を持たせるための Address モデル、都道府県用のマスターデータとして Prefecture モデルを作成します。
| Address |
| —- |
| postal_code: 郵便番号 |
| prefecture_id: 都道府県ID |
| city: 市区町村 |
| house_number: 番地 |
| building: 建物名・部屋番号 |“`
$ rails g model Address postal_code:integer
Deviseの日本語化
メモとして書いておく。
## Gemの追加
“`
gem ‘devise-i18n’
gem ‘devise-i18n-views’
“`
`$bundle install`## 日本語対応のymlファイルを作成
`$rails g devise:views:locale ja`## i18nの翻訳を日本語にする
config/application.rbファイルの
class Applicationの中に
`config.i18n.default_locale = :ja`を追加する。## config/locals/devise.ja.ymlに以下を追加する
この記事を参照
https://qiita.com/you8/items/921e0dd1210eb0d158df
“` config/locals/devise.ja.yml
ja:
activerecord:
errors:
models:
user:
attributes:
email:
t
Render.com(無料枠) データベースの使い分け
# 新しくデータベースを作成したい場合
Render.com(無料枠)は1つまでしかデータベースを起動できないようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881997/8c7f4fea-e273-da54-2910-7c58f470e06d.png)
新たに作成する際は、起動中のデータベースを停止してから行う必要があります。
Suspend Database ボタンで停止できます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2881997/677ca2a5-6944-ff2e-bf69-09421b1ecb53.png)
これで新たにデータベースを作成できます。
※複数データベースを作成しても、起動できるのは1つのみです。# 体験談
Rails チュートリアルで作成した「Sample_app」を元に、
Twitterのような「tweet_app」を作
【Vuex4 + Vue3 + Rails7】JWTとVuexを使ってトークンベースのログイン機能を実装する
# 環境
ruby 3.1.0
Rails 7.0.4
vue@3.2.41
Vuex@4.1.0# 初めに
個人開発でSPAのログイン機能を実装した時のメモです。
理解不足な面も多いので、指摘いただけると嬉しいです。ログイン状態は、Railsであればセッションで管理することができます。
セッションによる認証はサーバー側で行うため、
JSなどフロント側ではあまり気にしなくて良かったのですが、
**Vue.jsのようなSPAの場合はフロント側でも制御が必要になります。**そのログイン状態の管理を**トークンベースの認証**で実装しようと思います。
**以下仕様**
・ログインはパスワードとメールアドレスで実行する
・ログイン後のページは「ログイン状態」でないと遷移できない
・ログイン画面は、「ログイン状態」では遷移できない
・ログイン後、リロードしてもログイン状態が保持される
・ログアウトすると、ログイン画面に遷移する# トークンベースの認証とは
セッションを使ったログイン(認証)との違いをざっくり整理したいと思います。## セッションを使ったログイン
セッ
Rails 資料一覧
# React
https://techracho.bpsinc.jp/hachi8833/2022_05_26/118202
seed_fuのseedメソッドの引数を活用すれば、似たデータが重複して新規作成されることもないし、idをわざわざ書く必要もないぞと気づいた
## 困ったこと
Railsのseed_fu、こういう風にidなどprimary keyを書くのを巷でよく見かけます。“`ruby:db/fixtures/users.rb
User.seed do |s|
s.id = 1 # ←
s.name = “鈴木一朗”
s.email = “ichiro@example.com”
endUser.seed do |s|
s.id = 2 # ←
s.name = “鈴木二郎”
s.email = “jiro@example.com”
end
“`idなんて自動採番されるんだから、書く必要なくない?…ほら、削除してもデータ作れるじゃん!と無邪気にどや顔していたのですが、青二才でした。
確かにデータは作れます。しかしながら、seed_fuがいいのは、2回目以降流す時に、変更点だけを追加、または更新してくれるところ。primary keyを指定してあげないと、seed_fuは既存データか新規データかを判別できず、新しいデータをcreateしてしまいます。上記の例で言うと、鈴木一朗、鈴木二朗がダブってで
indexメソッド
# indexメソッド
文字列や配列の中に、指定した文字列が含まれていたとき、その文字列が何番目から配置されているのかを整数の値で返します。## 例
“`ruby
str.index(検索したい文字列, [検索を開始する位置])
“`indexメソッドの公式リファレンスはこちら。
https://docs.ruby-lang.org/ja/latest/method/String/i/index.html# indexメソッドを使ってプログラムを作成します
任意の文字列に”code”が、左から何文字目に出てくるかを返し、その数を出力するメソッドを作りましょう。
呼び出し・出力例は以下のような形で行います。
count_code(“codexxcode”) → 1(ターミナルの返し)
count_code(“aaacodebbb”) → 4(ターミナルの返し)
count_code(“cozexxcode”) → 7(ターミナルの返し)“`ruby
def count_code(str)
puts (str.index(“code”) + 1)
【Rails】UUIDをプライマリーキーにする
## 概要
– ユーザーIDをUUIDにする必要性があったため、検証しました
## サマリー
– UUID型のデータ型を持つ、PostgreSQLにすると簡単に対応が可能
– mysqlではUUIDを生成するところから実装して、データベースにUUIDを入れるような運用になりますということで、今回は、PostgreSQLで検証を進めます。
## 手順
Railsガイドによるマニュアル
[https://guides.rubyonrails.org/active_record_postgresql.html](https://guides.rubyonrails.org/active_record_postgresql.html)こちらをベースに検証を進めました。
今回は、ユーザーテーブルに対して、プライマリーキーをUUIDにする、というケースで手順を記載します。
### ユーザーモデルの作成
“`json
$ rails generate model User sub:string
“`※ column名は任意。今回は認証連携先のsubを格納する想定でsu
Ruby scanメソッド
# scanメソッド
対象の要素から引数で指定した文字列を数え、配列として返します。“`ruby
def count_hi(str)
puts str.scan(“hi”)
end
# 呼び出し例
count_hi(‘abc hi ho’)
“`“`ruby
hi
# ターミナル出力
“`scanの公式リファレンスです。
https://docs.ruby-lang.org/ja/latest/method/String/i/scan.html# scanメソッドを使ってプログラムを作成します
以下条件です。
– 条件1:対象となる文字列の中から、”is”という特定の文字列の数を取得すること
– 条件2:上記で取得した数を出力すること“`ruby
def count_hi(str)
puts str.scan(“is”).length
end
# 呼び出し例(引数には対象となる文字列を指定します)
count_hi(“This is a pen.”)
“`“`
2
# ターミナル出力
“`## 解説
今回は”is”という文字
Ruby if, elseを使ったプログラム
# if, elseを使ってプログラムを書きます。
あなたは警官です。aとb二人の容疑者の取り調べをしています。このとき、次のルールで証言の真偽判定を行います。
※問題文で登場したaとb二人の容疑者は、今回実装するpolice_troubleメソッドの引数として取り扱っていきます。条件は以下の通りです。
– 条件1:第一引数aと第二引数bどちらの証言も真(true)であれば、Trueを出力すること
– 条件2:第一引数aと第二引数bどちらの証言も偽(false)であれば、Trueを出力すること
– 条件3:第一引数aと第二引数bで証言の真偽が一致しない場合であれば、Falseを出力すること“`ruby
def police_trouble(a, b)
if (a && b) || (!a && !b)
puts “True”
else
puts “False”
end
end
“`# 解説
この問題は、論理演算子を用いて作成していきます。
下記参考までに。
“`ruby
# aもbもtrueの場合にtrue
a && b# a
rendering_optionsが見つからない時の対処方法:Rails 7 + Devise + Turbo
:::note warn
**注意(2023/02/09追記)**
[こちらのDeviseのpull request](https://github.com/heartcombo/devise/pull/5548)はTurboに対応し、マージされてDevise 4.9.0がリリースされたらこの記事のパッチは不要になります。
:::## Rails 7 + Devise + Turboを使うには
Rails 7のアプリでDeviseとTurboを使った時のパッチをいくつかのところで見かけました:[【2023年版】Turboを有効化したままRails 7.0でDeviseを使う方法](https://qiita.com/jnchito/items/48db78c465493837c41f)
[Devise Auth Setup in Rails 7](https://betterprogramming.pub/devise-auth-setup-in-rails-7-44240aaed4be)
[How to use Devise with Hotwire & Turbo.js D
AWS ECS + Rails + MySQL(Aurora) – 同じセキュリティグループに ECサービスとRDSを作成して RailsからDBアクセス可能にする
# 概要
同じセキュリティグループ同士は無条件に全てのトラフィックが許可されるので、ECSサービスもRDSも同じセキュリティグループに作成することでRailsからDBへのアクセスを可能にする
# Rails
scaffoldなどでDBアクセスが発生するページを作成しておく
“`
rails generate scaffold users name:string
“`Productionでのデバッグ用に一時的に画面からエラー確認できるようにしておくと便利かもしれない
`rails-docker/config/environments/production.rb`
“`rb
Rails.application.configure do
config.consider_all_requests_local = true
“`# VPCの作成
パブリックサブネット2個
プライベートサブネット0個でVPCを作成する
【Rails】部分テンプレートをアクションごとに挙動を変えたいときはcontroller.action_nameが便利
# どうした?
「表示が同じページは部分テンプレートを使う」
これはどんな教材でも言われている内容です。
よくある例として`new`ページと`edit`ページは`_form.html.erb`というファイルを用意して、`render`メソッドで呼び出すことで、投稿フォームをDRYに保ちます。ただ、ほとんど同じだけどアクションによって表示の一部を変えたい時ってあると思うんです。
そんな時の対処法をアウトプットします。# 手順
今回は、`new`ページと`edit`ページに対して`_form.html.erb`というファイルを用意し、ページタイトルをアクションごとに変えるというシーンを考えてみます。## ビューファイル上で`controller.action_name`での条件分岐をする
`controller.action_name`は、現在のアクション名を返すメソッドです。
これを利用することで、`case`で条件分岐させてアクションごとに表示を変えることができます。“`erb
<% case controller.action_name %>
<% when 'ne
【Rails】モデルのカラムで選択肢を指定したいときはenumerize gemを使おう
# どうした?
ToDoアプリを作成しています。
各Todoに対して
* waiting(未着手)
* working(仕掛中)
* done(完了)の選択肢を持った`status`カラムを付与する時に便利になりそうなenumerize gemを導入し、設定する方法をアウトプットします。
# 手順
## gemのインストール
Gemfileにenumerizeを記載します。
“`ruby
gem ‘enumerize’
“`
記載したら`bundle install`しましょう。## モデルに選択肢を設定
**マイグレーションファイル**
マイグレーションファイルにて、Todoモデルに`status`カラムを付与する指示を与えます。
このとき、新規レコード作成時にバリデーションに引っかかるのを防ぐためにデフォルト値を指定すると良いでしょう。
“`ruby
t.string :status, null: false, default: :waiting
“`**モデル**
モデルファイルで`status`の選択肢を配列形式で与えます。
Enumerizeモジュ
docker-composeを使ってdocker化する方法(rails6×My SQL)
# 開発環境
* Mac (M1)
* Rails 6
* ruby 2.7.5
* mysql 12# docker化する流れ
1\. 必要なファイルを準備2\. コンテナイメージのビルド
3\. Rails プロジェクトを作成
4\. データベースの準備
5\. 必要なパッケージをインストール
6\. コンテナを起動
7\. 動作確認
## 1\. 必要なファイルを準備
### 空ファイルの準備
まずは rails-docker ディレクトリローカルの中に
以下の 5 つの空ファイルを作成しましょう。Dockerfile
docker-compose.yml
Gemfile
Gemfile.lock
entrypoint.sh“` touch {Dockerfile,docker-compose.yml,Gemfile,Gemfile.lock,entrypoint.sh} “`
上記のコマンドを入力するとファイルが一気に作成できます。
作成できたら、Gemfile.lock 以外の 4 ファイルを編集していきます。### Dockerfi