- 1. RailsのCORSで配列の環境変数を使うときの注意
- 2. 【Athena】重くなってきた読み込みを何とかしたい② パーティション射影を利用してみる
- 3. 【Athena】重くなってきたパーティション読み込みを何とかしたい① シンプルに読み込み対象のログを減らしてみた
- 4. VSCodeでrailsのログファイルを開くとカラーコードが制御文字で表示されるのを何とかする
- 5. ツイートを編集
- 6. 勉強会での小話6
- 7. 勉強会での小話5
- 8. ebayのカードカテゴリ商品のコンディション設定について
- 9. Rails RESTfulなルーティング
- 10. フレームワーク(Ruby on Rails)を触って出てきた横文字たちの正体とは?
- 11. 【Rails】assertとassert_predicateの違い
- 12. たぶん年明けくらいに一番言ったこと
- 13. stimulus.jsからのturbo_frameリクエストを送信する方法
- 14. 【Rails】初学者向けエラー対応まとめ
- 15. Rails 上の N+1 クエリを検出、修正、防止する方法
- 16. 【Ruby】RubyのStructを活用する
- 17. 投稿機能アプリの削除機能
- 18. 【Rails】enum 使う時はprefixを使いましょう
- 19. 【kaminari】Rails APIで全体のページ数をレスポンスで返したい
- 20. サンプルコードでわかる!Ruby 3.3の主な新機能と変更点
RailsのCORSで配列の環境変数を使うときの注意
# はじめに
こんにちは、HappyManaです。
RailsのCORS設定で、オリジンを複数指定したいことがあり、環境変数に配列を使いました。
その際の注意点を備忘録として残します。# 環境変数に配列を使う
環境変数で配列を使う際は、以下のように書きます。
“`env
CLIENT_ORIGIN=[“http://localhost:8000″,”https://example.jp”]
“`CORSのoriginsには以下のように書きます。
“`
origins JSON.parse(ENV[‘CLIENT_ORIGIN’] { ‘[]’ })
“`# 注意点
## シングルクォーテーションで囲わない
例として、以下のようにシングルクォーテーショを使った配列にします。
“`env
CLIENT_ORIGIN=[‘http://localhost:8000′,’https://example.jp’]
“`そうすると、以下のエラーが出ます。
“`
/usr/local/lib/ruby/3.1.0/json/common.rb:216:in `parse
【Athena】重くなってきた読み込みを何とかしたい② パーティション射影を利用してみる
# はじめに
[【Athena】重くなってきたパーティション読み込みを何とかしたい① シンプルに読み込み対象のログを減らしてみた](https://qiita.com/TKY_study/items/969f2a21f73ce598979e)の続きとなります。# 今回試してみた事:パーティション射影の導入
元のDDLをベースにTBLPROPERTIESを以下のように書き換えて設定を行いました。
パーティションの範囲の関しては`..`が使用でき、例えば`’01,02,03,04’`は`01..04`と書けます。
また「〇〇以降」といった設定法が無さそうでしたので、yearに関しては仮で`2021..2100`としました
設定の結果、数日おきのパーティションロード等であれば数十秒程度で完了出来るようになりました。“`SQL
CREATE EXTERNAL TABLE `app_prod_rails`(
`date` string COMMENT ‘from deserializer’,
`container_name` string COMMENT ‘from des
【Athena】重くなってきたパーティション読み込みを何とかしたい① シンプルに読み込み対象のログを減らしてみた
# はじめに
度々ログ調査が発生する~~問題児(;´༎ຶД༎ຶ`)~~、ECS on EC2構成にて3年ほど稼働しているとあるRailsアプリケーションについての話となります
# 問題
ログがたまり続けることで`MSCK REPAIR TABLE`の実行が日に日に遅くなってきており、ついに読み込みの完了まで1時間以上かかる状態となってしまいました。
基本的にログ調査というと直近のログが対象となる事が多い状況でしたので、調査開始が遅れてしまいます。# 今回試してみた事:シンプルに読み込み対象のログを減らしてみた
現状の構成を確認したところ以下のようになっており、稼働初期からの全ログが読み込み対象となっていました。“`SQL
CREATE EXTERNAL TABLE `app_prod_rails`(
`date` string COMMENT ‘from deserializer’,
`container_name` string COMMENT ‘from deserializer’,
`source` string COMMENT ‘from deseri
VSCodeでrailsのログファイルを開くとカラーコードが制御文字で表示されるのを何とかする
# 事象
VSCodeでrailsのログファイル`log/development.log`を開くと以下のようになります
[![VSCodeでログファイルを開いた様子](https://i.gyazo.com/6ecc074097464cea984d74ca7267e75d.png)](https://gyazo.com/6ecc074097464cea984d74ca7267e75d)`ESC`や`[1m`や`[36`など謎の文字が表示されており見づらいです。
# 対策
拡張機能ANSI Colorsをインストールしましょう。https://marketplace.visualstudio.com/items?itemName=iliazeus.vscode-ansi
## 使い方
`Ctrl + Shift + P`で開いたプロンプトで`ansi`と入力すると`ANSI Text: Open Preview`とでるのでこれを選択します。[![ANSI ColorsのPreview画面](https://i.gyazo.com/89389b79003f25a3f86c0
ツイートを編集
投稿機能アプリの実装の復習を備忘録としてあげてます!
### 目的
– CRUD(UPDATE)
– HTTPメソッドのPATCH
– edit アクションの処理の理解
– updateアクションの処理の理解### ツイート編集機能の実装
1. ツイート編集画面のルーティング設定
2. 編集ボタン編集ボタンをビューに追加
3. editアクションをコントローラーに定義
4. 編集画面のビューファイルを作成
5. ツイートの更新を行うためのルーティングを設定
6. updateアクションをコントローラーに定義「editアクションで編集ページを「表示」→「updateアクションでデータの更新」
### edit アクションのルーティング設定
config/routes.rb
“`ruby
〜略〜
resource :tweets, only: [:edit]
〜略〜
“`ターミナルで
rails routesコマンドで確認
ターミナル
` edit_tweet GET /tweets/:id/edit(.:format)
勉強会での小話6
# はじめに
この記事は2023年度の振り返りです。
こちらの続きとなります。
https://qiita.com/youfuku/items/567b3cf510bf40cb3371
問題を解いてる時の実話を元に、作成しております
# 勉強会内の小話
講師:よし、最後のリレーションの問題だ!
講師:「アイシールド21」と同じ作者が書いた作品全てを返すリレーションを作ってみよ!初学者達:はい!
初学者達:これでどうでしょう!
“`ruby
class Comic < ApplicationRecord has_many :kaku, foreign_key: 'book_id', class_name: 'Write' has_many :kaita_hito, through: :kaku, source: :hito has_many :onaji_sakusya, through: :kaita_hito, source: :kaita_manga end ``` ```ruby class Write < ApplicationRecord
勉強会での小話5
# はじめに
この記事は2023年度の振り返りです。
こちらの続きとなります。
https://qiita.com/youfuku/items/09f387f1e9f14e9469da
問題を解いてる時の実話を元に、作成しております
# 勉強会内の小話
講師:前回、joinの中で紐づけをしてたけど、直接呼べるようにリレーションを組んでおけば楽なので、今回はそれをやってみよう!
初学者達:わかりました!has_manyのthroughですよね!参考書で勉強してる時に読みました!
講師:知ってるなら話は早い。やってみよう!
初学者達:はい!
初学者達:こんな感じでどうでしょう!
“`ruby
class Comic < ApplicationRecord has_many :writes, foreign_key: 'book_id' has_many :author, through: :writes end ``` ```ruby p Comic.joins(:author).where(author: { name: '冨樫 義博' }) ``` 講
ebayのカードカテゴリ商品のコンディション設定について
## はじめに
eBayにおいて、カードカテゴリに商品を出品する際には通常のコンディション設定(newやusedなど)とは異なり、カードカテゴリ特有のコンディションとそれに付随する情報を設定する必要があります(設定しないと出品できないです)。この記事では、対象となるカテゴリやコンディションの設定方法、そしてそれに関連するテーブル構成について簡単に説明します。
## 対象カテゴリ
通常とは異なる設定が必要になるカードカテゴリは以下の3種類です。・Sports Memorabilia, Cards & Fan Shop > Sports Trading Cards > Trading Card Singles (CategoryID: 261328)
・Collectibles > Non-Sport Trading Cards > Trading Card Singles (CategoryID: 183050)
・Toys & Hobbies > Collectible Card Games > CCG Individual Cards (CategoryID: 183454
Rails RESTfulなルーティング
## 目次
[1. はじめに](#1-はじめに)
[2. Rails のルーティング設計](#2-rails-のルーティング設計)
[3. RESTful なルーティングとは](#3-restful-なルーティングとは)
[4. 参考](#4-参考)## 1. はじめに
Rails で CRUD 処理を作成中、どの操作がどのルーティングなのかよく忘れてしまうため、備忘録としてまとめておくことにしました。
また Rails のルーティングは REST 設計に基づいていますが、REST 設計についてあまり知りませんでした。
RESTful なルーティング設計は Rails をはじめ広く採用されているため、その考え方やメリットについても調べてみようと思いました。## 2. Rails のルーティング設計
まずは、Rails のルーティング設計がどうなっているかを見てみたいと思います。
これは、Rails にルーティングを自動作成してもらうことで簡単に分かります。### ルーティングを自動作成
Rails では、ルーティング設定用のファイル `conf
フレームワーク(Ruby on Rails)を触って出てきた横文字たちの正体とは?
# はじめに
自分は10月よりAPPRENTICE SHIP(内定直結型エンジニア学習プログラム)のカリキュラムに2期生として参加しています。
今回はRuby on Railsを学び始めて謎の横文字が多く出てきます。
その中で特に覚えておきたいけど、毎度詳細を聞かれると調べ直しているものをピックアップしてまとめました。# MVCモデル
## MVCモデルとは?
MVC(Model-View-Controller)モデルは、ソフトウェア開発のための「設計パターン」の一つになります。## M(モデル)
モデルはアプリケーションのデータやビジネスロジックを管理します。
データベースへのアクセスやデータの操作、バリデーションなどが含まれます。## V(ビュー)
ビューはユーザーに対する表示やインターフェースを担当します。
ユーザーが見ることができる部分やユーザーとの対話が含まれます。
Railsだとerb(テンプレートエンジン)を用いて各場所がビューに該当します。## C(コントローラー)
モデルとビューの制御を担う場所になります。
コントローラーはユーザーからの入力を受け取
【Rails】assertとassert_predicateの違い
## 1. はじめに
現在、RailsチュートリアルでRuby on Railsを学習しています。
第6章で紹介されるテストコードに対してRubocopで解析をかけたところ、`assert @user.valid?`ではなく`assert_predicate(@user, :valid?)`の使用を推奨されました。
今回はこれら2つの違いについてまとめていきます。
## 2. assert・assert_predicateとは
assertメソッドもassert_predicateメソッドもMinitestで使えるアサーションの1つです。
[Rails テスティングガイド](https://railsguides.jp/testing.html)の説明を引用してまとめると以下の通りです。**■ assert**
指定した式(test)がtrueである場合、テスト成功。> **`assert( test, [msg] )`**
>
> – `test`はtrueであると主張する。**■ asset_predicate**
オブジェクト(obj)の
たぶん年明けくらいに一番言ったこと
# 例外処理書かないならバイつけようぜバイ
今年の頭か去年の頭か時期は忘れたもののrailsのコードでデータの検索時にfindを書いているパターンをよく見ました。# なんか違うんだっけ?
基本的な話ですが、findとfind_byではいろいろと違うことがあります。
検索の条件に渡せるものがfindだとIDだけなのに対してfind_byになると他のカラムで行けたり、取得結果としてfindだと複数取得できるけどfind_byだったらマッチした最初の1件だったり・・・そして一番の違いがマッチするデータがなかった時の挙動です。
find_byではnilが返ってくるのに対してfindだと例外(ActiveRecord::RecordNotFound)を発生させて処理が中断します。# 例外処理書くならfindでもいいんだけどね
データがなかった場合は・・・するみたいな処理の時はfindで例外処理書いてあげればデータ取得→有無判定→処理の流れで有無判定をなくせるのですっきりするものの指摘したときはそういう処理だったわけでもなかったのでfind_byでええやん、になりましたとさ# 今は
stimulus.jsからのturbo_frameリクエストを送信する方法
# はじめに
JavaScriptでTurboFrameリクエストを行う方法がわかったので共有します。# 問題
‘modal’という名のturbo_frame_tagにJavaScriptで’/modals/pop_ups’というリクエストを行いたい場合は通常のlink_toタグなどでのリクエスト送信ができない。# 解決方法
“` js
sendTurboRequestToPopUpModal = () => {
// turbo_frame_tag ‘modal’を示している
// turbo_frame_tagは指定した属性と同名のidが付与されるため
const frame = document.getElementById(‘modal’)
// turbo_frame_tagはsrc属性を付与するだけでその部分を指定のURLに置換する原理があるため、この処理だけでmodalが開く
frame.src = ‘/modals/pop_ups’
}
“`
turbo_frame_tagはsrc属性に設定されたURLに中身を
【Rails】初学者向けエラー対応まとめ
# はじめに
プログラミングはエラーと切っても切り離せない関係です。
素人からどんな玄人でもエラーと向き合いながら開発をしていきます!エラーと仲良くなり、乗り越えることを通してプログラミングの喜びを味うことができるでしょう。この記事では主に初学者向けにRailsアプリ開発におけるエラーを取り上げます。
# Goal
一般的なエラー解決の向き合い方と代表的なエラー解決のユースケースについて知る。# エラー対応の原則
エラー解決には、構造や因果関係を理解したうえで、様々なヒントから原因を推測し、変更を加える必要があります。
エラー解決できる能力は、確かに経験値に依る側面も大きいですが、吸収のスピードを上げることも大切です。構造や因果関係の理解に関しては、学習コンテンツを読み込んだりして理解に努めると良いでしょう。原因の推測に関して、例えば、基本的な投稿機能やが上手く実装できないとなった場合、以下のように原因を推測してみましょう!
根っこのデータベースから順番に必要な仕組みが備わっているか確認していきます。### 1. テブル、カラムがあるか
db/schema.rbを
Rails 上の N+1 クエリを検出、修正、防止する方法
### N+1 クエリとは?
N+1 クエリは、Rails アプリで Active Record などのObject Relational Mapping(ORM) を使用するときによく発生するパフォーマンスの問題です。 これは、ORM が単一のクエリを使用してすべてのオブジェクトを一度にロードするのではなく、オブジェクトのリストにあるオブジェクトごとに個別のクエリを実行するときに発生します。たとえば、次のコードを考えてみましょう。
“`
# Get all comments
comments = Comment.all# For each comment, a new user query will be triggered
comments.each do |comment|
comment.user
end
“`
Comments テーブルに 1000 レコードがある場合、以上のコードは、コメントしたユーザーを取得するために 1000件の個別のクエリを実行することになりますが、これは非常に非効率的になる可能性があります。 これは N+1 クエリの例です。N+
【Ruby】RubyのStructを活用する
# 1. Struct
RubyにはStructという、構造体を扱うクラスがあります。:::note info
構造体とは?
構造体とは「1つ以上の、任意の種類の値をまとめて1つにしたもの」である。データや情報、プログラムのコードなどを意味のある単位に分類・分割・整理して、構造的にまとめることが目的。
無秩序なデータをオブジェクト指向的に記載できるので最高。
:::## TL;DR
– 「シンプルなデータ構造」「一時的なデータのカプセル化」を目的としている。ここでの「一時的」の定義は、主にプログラムのスコープやライフサイクルの短さを指す
– 「構造や目的がはっきりしているが、完全なクラスを定義するほどではない場合」に用いられる
– リファクタリングの文脈だと「責務が複数存在するモデルを分割するための最初のステップ」として用いられる
– Hashでサイレントエラーが起きてしまった場合にStructが検討されることもある(Structで属性間違えたらエラーが出るので、エラー検知が迅速)# 2. Structの基本的な定義・振る舞い
– 任意のパラメーター、メソッドを定
投稿機能アプリの削除機能
備忘録としてあげさせていただきました。
## 目的
– CRUDのD(DELETE)を体験
– データの操作で基本的な処理となる「削除」を理解
– destroyアクションを理解
– Prefix## 削除機能
7つのアクションのうち、削除機能はdestroyが該当## 実装の流れ
1. ツイートを削除するためのルーティングを設定
1. 削除ボタンをビューに追加
1. destroyアクションをコントローラーに定義する## destroyアクションのルーティング設定
config/routes.rb
“`ruby
resources :tweets, only: [:index, :new, :create, :destroy]
“`## 削除ボタンを投稿一覧に追加
`linl_to`mメソッドを使い、削除ボタンを追加
削除ボタンのパスには **_ツイートのid_**を パラメーターとして持たせる
/tweets/《tweetのid》というパスにすると、パラメーターとして受け取ることができるHTTP: **_DELETE_** メソッド
【Rails】enum 使う時はprefixを使いましょう
# はじめに
`enum`を使う時は`prefix`を使いましょう、という提案です。# なぜprefixを使うと良いのか
**1.可読性が上がる**、**2.拡張性が高くなる**からです。
## 可読性が上がる
“`ruby
class Article < ApplicationRecord belongs_to :user enum :status, { unsaved: 10, draft: 20, published: 30 }, _prefix: status end ``` `_prefix`がない場合も一見わかりやすいですが、個人的には`_prefix`を付与することで、`モデル`の`このカラム`の`このステータスの状況`が一目でわかりやすくなります。 ```ruby:_prefixがない場合 [3] pry(main)> article.published?
=> true
[4] pry(main)> article.draft?
=> false
[5] pry(main)> article.unsaved?
=> false
“`“`rub
【kaminari】Rails APIで全体のページ数をレスポンスで返したい
# はじめに
`Rails API`と`kaminari`使用時に**全体のページ数**を取得してレスポンスしたかったので、その方法についてまとめます。# 手順
再利用できるよう、consernsにモジュールとして切り出しておきます。
`kaminari`では、`Article.page(1).total_pages`のように`total_pages`を使うことで全体のページ数を取得することができます。“`ruby:app/controllers/concerns/pagination.rb
module Pagination
extend ActiveSupport::Concerndef pagination(records)
{
total_pages: records.total_pages # 全体のページ数
}
end
end
“``meta: pagination(articles)`で`pagination`を呼び出し、`meta`キーを配下として値を時データを参照ができ、最終的に`adapter: :json
サンプルコードでわかる!Ruby 3.3の主な新機能と変更点
## はじめに
Rubyは毎年12月25日にアップデートされます。
Ruby 3.3は2023年12月25日に正式リリースされる予定です。
本記事の執筆時点ではrc1がリリースされています。https://www.ruby-lang.org/ja/news/2023/12/11/ruby-3-3-0-rc1-released/
この記事ではRuby 3.3で導入される変更点や新機能について、サンプルコード付きでできるだけわかりやすく紹介していきます。
ただし、すべての変更点を網羅しているわけではありません。個人的に「Railsアプリケーションの開発時に役立ちそうだな」と思った内容をピックアップしています。本記事で紹介していない変更点も多数ありますので、以下のような情報源もぜひチェックしてみてください。
https://www.ruby-lang.org/ja/news/2023/12/11/ruby-3-3-0-rc1-released/
https://github.com/ruby/ruby/blob/v3_3_0_rc1/NEWS.md
### 動作確認したRub