- 1. rails7にsotalbeを実装
- 2. 未ログインユーザーの閲覧数カウント
- 3. 一覧画面に検索機能実装 Rails ransack
- 4. TypeScriptの新しいORMに同期APIを採用した理由
- 5. 【Rails6.1】同じUser同士じゃない場合のDM機能(課題は残る)
- 6. 【Rails6.1】2種類のレイアウトを使ったブックマークを非同期にする方法
- 7. [Rails] エラーメッセージを日本語で設定する
- 8. Railsでいいね機能:ビューファイル中で使用しているいいね判定メソッドでn+1問題が発生した時の対処法
- 9. railsでdistinctとin_batchesを同時に利用するのはアンチパターン
- 10. クラスにモジュールを取り込むinclude、prepend、extendの違いと比較
- 11. Rubyのクラスメソッドとインスタンスメソッドの概念
- 12. Javascriptを使用してフォームを何個も追加
- 13. Action View Bug Report with View Paths
- 14. 【Rails】手動テストでカバレッジを計測する
- 15. DM(チャット)機能 非同期化
- 16. DM(チャット)機能非同期化の失敗
- 17. Rails でカラムを追加する際、既存レコードに影響を与えずにデフォルト値を設定したい
- 18. rails永続的なセッション
- 19. [Rails7]submitにつけるdisable_withオプションについて
- 20. ActiveHash
rails7にsotalbeを実装
# はじめに
久々にrailsの並び替え機能を実装したので、その際の作業録です。# 実装
昔は、以下のgemを利用した時期もありましたが、jqueryが利用されていることだったり、メンテがされてないとかがあったので、今回は利用しないことにしました
https://github.com/itmammoth/rails_sortable今回は、stimuls componetsにあるこちらを利用しました。
https://www.stimulus-components.com/docs/stimulus-sortable### javascript関係
“`
yarn add @stimulus-components/sortable sortablejs @rails/request.js
“`“`js:app/javascript/controllers/index.js
import { Application } from ‘@hotwired/stimulus’
import Sortable from ‘@stimulus-components/sorta
未ログインユーザーの閲覧数カウント
# はじめに
絶賛ポートフォリオ制作中です!
今回は未ログインのユーザーが投稿詳細画面を表示した時に、
閲覧数をカウントするように実装したためアウトプットします✍️※旅行やデートのプランを共有するアプリなので、投稿機能はPostではなくPlanを使用しています!
# ER図
# モデル、マイグレーションファイル作成
#### モデル作成
“`
$ rails g model ViewCount user:references plan:references
“`:::note info
referencesとは(直訳:参照、参考)
名前の通り、作成済みのテーブルを参照する場合に使用します
コマンドを実行すると下記カラムがマイグレーションファイルに自動追加されます
“`
t.references :user
一覧画面に検索機能実装 Rails ransack
## はじめに
今回はRailsの検索機能実装でransackを使用したので、使い方について記載します。
Rails初心者のため、間違いなどあればご指摘お願いします。## ransackとは
Railsで検索の実装を行うgemのことです。
ransackがなくても検索の実装はできるのですが、ransackを使用することで簡単に検索機能の実装が可能です。## 使い方
### ①Ransackインストール“`ruby:Gemfile
gem `ransack`
“`“`ruby:コマンド
# アプリをインストールする
$ bundle install
“`### ②コントローラを修正する
検索ワードを受け取り、検索結果をインスタンス変数にセットします。“`ruby:tasks_controller.rb
def index
@q = current_user.tasks.ransack(params[:q])
@tasks = @q.result(distinct: true).recent
end
“`### ③ビューを
TypeScriptの新しいORMに同期APIを採用した理由
私は[Accel Record](https://www.npmjs.com/package/accel-record)という、TypeScript用ORMライブラリを開発しています。
Accel Recordは他のTypeScript/JavaScript用ORMライブラリとは異なり、非同期APIではなく同期APIを採用することにしました。この記事では、Accel Recordが同期APIを採用するに至った経緯と理由を整理します。
## 作ろうとしたORM
『[TypeScriptで書ける型安全なRuby on Railsを求め、ORMの開発を始めた](https://qiita.com/koyopro/items/748ddd27aa32ff14c95f)』という記事で、TypeScript用のORMライブラリを作り始めたことを紹介しました。
私の希望は「TypeScriptにもRuby on Railsくらい開発効率の高いフレームワークが欲しい」というものです。そのために、RailsのActive Recordのような機能を持つORMをTypeScriptで作れないか試
【Rails6.1】同じUser同士じゃない場合のDM機能(課題は残る)
# はじめに
メッセージ(DM機能)を作成した際、私が作成したメッセージ機能の場合、同じユーザ同士ではなく、ShopユーザとMemberユーザという異なるユーザとのやり取りになりました。この場合のメッセージの表示方法などに何度も混乱させられました。
正直、あまり良いやり方とは自分でも思えないのですが、頑張ったので振り返りのために記録しておこうと思います。# 前提
もっと簡単な方法があったんじゃないかという気もしている前提条件。
![2024-06-20メッセージ機能1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762011/bb2a2863-5ab2-9032-4c7c-7ac0dbe2f407.png)
member用のメッセージデータのmember_messagesと
shop用のメッセージデータのshop_messagesを作っています。※Roomsにあるis_take_careは対応待ちと対応済みの判定を行うためのデータ。
(trueなら対応済みでfalseなら対応待ち)
【Rails6.1】2種類のレイアウトを使ったブックマークを非同期にする方法
# はじめに
ブックマーク機能を作成する際に、詳細ページと商品一覧ページで違う形のボタンを使用することにしました。
この状態で非同期にするにはどうしたら良いんだろう…?と悩みながら進めたので、実際に使った方法を記録しておきます。これが、商品詳細のブックマーク。横長のボタンになっています。
![2024-06-20ブックマーク2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762011/06a17ce4-1a3b-4d21-e39c-1f009de43b65.png)
こっちが商品一覧のブックマーク。リボンのアイコンになっています。
![dc1875f3917c3b8010e0b6936264613e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762011/ee8cf26c-97c0-3411-5e4a-f84b334f97b3.png)
# 今回のポイント
create.js.erbファイルの記
[Rails] エラーメッセージを日本語で設定する
# はじめに
フォームの入力で、バリデーションで失敗した際に、エラーメッセージを表示させると思います。
その場合、デフォルトだと英語になります。日本語で表示させるためには、設定が必要なのと、メッセージも自由に記載することができます。
今回はその内容をアウトプットいたします。# 設定
`config/application.rb`に、以下を記載いたします。
“`rb:config / application.rb
config.i18n.default_locale = :ja
“`続いて、`config/locales/ja.yml`に記載いたします。
“`yml:config / locales / ja.yml
ja:
activerecord:
attributes:
hoge_model:
fuga_column: ‘fugaカラム’
errors:
models:
hoge_model:
blank: ‘%{attribute}は必須項目です’
Railsでいいね機能:ビューファイル中で使用しているいいね判定メソッドでn+1問題が発生した時の対処法
## 読んで欲しい人
– Railsでいいね機能を実装していて
– ビューのループ中でクエリを発行するメソッドを使用している人
– SQLクエリがたくさん出てきて、n+1問題が発生している人
– 過去の自分
## 動作環境
– MacOS 14.5
– ruby 3.3.0
– Rails 7.1.3.3
– psql (PostgreSQL) 14.11## 作っているアプリの構造
### 概要
– 小さいX(旧ツイッター)みたいなアプリ
– ログイン機能
– 短文の投稿機能
– いいね機能
### テーブル設計
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819522/487a583f-ba66-738d-616c-8690cb94d7da.png)
## エラー・課題
“`sql
app/models/user.rb:23:in `already_liked?’
16:48:02 web.1 | Rendered posts/_li
railsでdistinctとin_batchesを同時に利用するのはアンチパターン
# 背景
railsでdistinctとin_batchesを同時に利用すると、正しい値が取得できなかったので解説する# 内容
`User.select(:user_id).distinct.in_batches(of: 2) { p _1.pluck(:id)}` の挙動についてusersテーブルに1~5のidを持つレコードが格納されているとした時、
“`
[1,2]
[3,4]
[5]
“`と出力されると期待していたが
“`
[1,3]
[1,2]
[4,5]
“`のように値が重複して出力されてしまった
`User.select(:user_id).distinct.in_batches(of: 2) { p _1.pluck(:id)}` の挙動について
ChatGPTに確認したところ、
> ActiveRecordでdistinctを使用して一意なレコードを取得した後にin_batchesを使用すると、クエリの処理方法によっては重複した値が含まれる場合があります。これは、in_batchesがページング処理を行う際にdistinctが適用される前
クラスにモジュールを取り込むinclude、prepend、extendの違いと比較
モジュールをクラスに組み込むには3つの方法があります。それは `include`、`prepend`、そして `extend` です。この記事では、これら3つの方法の違いと共通点を詳しく解説し、比較します。
## Rubyのinclude
`include` は、他のモジュールからコードをクラスにインポートする最も一般的な方法です。`include` はモジュールのメソッドをクラスのインスタンスメソッドとして追加します。つまり、そのクラスのオブジェクトでこれらのメソッドを呼び出すことができます。
### includeの例
“`ruby
module Greetings
def greet
puts “Hello world!”
end
endclass Person
include Greetings
endperson = Person.new
person.greet # 出力: “Hello world!”
“`### モジュールをクラスにincludeしたときのancestors chain
モジュールをクラスに `include
Rubyのクラスメソッドとインスタンスメソッドの概念
**クラスメソッド**と**インスタンスメソッド**はオブジェクト指向プログラミングにおいて重要な概念です。この記事では、Rubyプログラミング言語におけるクラスメソッドとインスタンスメソッドについて説明します。
## クラスメソッドとは?
クラスメソッドはクラス上に定義され、クラスのインスタンスではなく、クラス自体に対して直接呼び出すことができるメソッドです。これらはクラス全体に関連する操作に使用されることが多いです。
#### クラスメソッドの定義方法
Rubyではクラスメソッドの定義方法は非常に柔軟です。以下にクラスメソッドを定義するための3つの一般的な方法を示します。
“`ruby
# 方法1
class Car
def self.total
10
end
endputs Car.total # => 10
# 方法2
class Car
class << self def total 10 end end end puts Car.total # => 10# 方法3
class Car; end
Javascriptを使用してフォームを何個も追加
# はじめに
ポートフォリオ制作中です!
書こう書こうとずっと思ってはいたのですが、なかなか手がつけられず…
忘れないうちに書き始めようと決心しました…!間違えているところ等ございましたら、ご指摘いただけますと幸いです🙇
今回はJavascriptでフォームを何個でも追加できるような実装をアウトプットします✍️
`accepts_nested_attributes_for`を使用して子要素を親要素で保存や変更できるようにしています!
(後々調べると、`accepts_nested_attributes_for`は使用しない方がいいかもという記事をちらほら見かけますが、ポートフォリオも終盤で今更変えられないのでこのままでいきます!)https://zenn.dev/murakamiiii/articles/5ecefb7a58d1ef
https://zenn.dev/ysi831/articles/0faa4c301e7d9f
# 完成図
旅行やデートのプランを共有するSNSサイト「Go out Planning」を絶賛作成中です
プラン概要の中に何個でもスケジュールフ
Action View Bug Report with View Paths
Recently there was a [bug](https://github.com/rails/rails/issues/52142) reported to rails which results in an infinite loop when passing a form builder object into a partial.
“`ruby
<%= form_for [:admin, @author], html: { class: 'form form-horizontal', multipart: true, style: 'margin-bottom: 0' } do |f| %>
<%= render partial: 'my_partial', locals: { f: f } %>
<% end %>
“`This would result in:
“`ruby
Completed 500 in 1701ms (ActiveRecord: 1314.9ms | Allocations: 163362)SystemStackErro
【Rails】手動テストでカバレッジを計測する
# はじめに
Ruby on Railsプロジェクトの手動テストでもコードカバレッジできたので、その方法をメモしておきます。
通常、カバレッジは自動テストコードの実行とともに計測するものですが、何らかの事情で自動テストコードが不足していてカバレッジが計測できない、あるいはカバレッジがとても低いといったことがあるかと思います。
本来、自動テストコードを書き足してカバレッジを上げるべきなのですが、それができない場合、せめて手動テストのカバレッジを計測できれば、手動テストの有効性が可視化できるのではないかと考えました。
# 前提
カバレッジ計測用のgemとしてSimpleCovが導入されている前提です。
このgemを普通に使うための導入や設定方法は他の記事を参考にしてください。この記事では手動テストでカバレッジする方法にフォーカスしてお伝えします。
# 計測の流れ
– 手動カバレッジの設定を行う(下記参照)
– Rails起動時にカバレッジの計測を開始する
– 各種手動テストを行う
– 手動テストが終わったらカバレッジの計測を止めてレポートを出力する
– レポートを見る#
DM(チャット)機能 非同期化
# はじめに
非同期化の失敗を先ほどアウトプットしていましたが、
DM機能の非同期化もまとめておきたいと思います!# 完成物
コメントは吹き出しをつけて、送信フォームは下に固定しています!# ER図
今回は非同期化のまとめなので実装方法は割愛しますが、
こちらのER図にて実装しています![スクリーンショット 2024-06-19 21.39.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/042bc327-f2fe-fa71-6e98-9e0c60504436.png)
実装方法はこちらの記事が大変わかりやすかったです
⚠️全く同じというわけではないと思います!https://qiita.com/mi-
DM(チャット)機能非同期化の失敗
# はじめに
ポートフォリオ制作中です
今まで、いいねやコメント、フォローと非同期化してきましたが、
今回は大きく躓いてしまったのでアウトプットします⚠️こちらは失敗のアウトプットです
非同期化の全体の流れは以下の記事にまとめてます🌱https://qiita.com/3rarara/items/b434d7331f88c5ee5a49
# 一つ目のエラー
“`
ActionController::UnknownFormat in Public::ChatsController#create
Public::ChatsController#create is missing a template for this request format and variant.
request.formats: [“text/html”]
request.variant: []
raise ActionController::UnknownFormat, message
“`テンプレートフォーマットがないよと言われています
これはシンプルに`local: true`を`lo
Rails でカラムを追加する際、既存レコードに影響を与えずにデフォルト値を設定したい
株式会社iCAREの[西口](https://twitter.com/NishiguchiNaoya)です。
今回は、デフォルト値付きでカラムを追加する要件のレアケースに遭遇したので記事に残します。## 実現したかったこと
デフォルト値を指定してカラムを追加する、という実装はよくあると思いますが、今回は下記要件を満たす必要がありました。:::note info
– 既に存在するレコードにはデフォルト値を適用せず、 `nil` を割り当てたい
– 今後作成するレコードにはデフォルト値が入るようにしたい
:::## 結論から 💁♂️
### うまくいったコード
“`ruby
class AddColumnToHogeTables < ActiveRecord::Migration[5.0] def change # デフォルト値を nil でカラムを追加した後、 100.0 に設定する add_column :hoge_tables, :some_item, :float, default: nil change_column_default :
rails永続的なセッション
# 概要
railsを勉強している時に永続的なセッションを作成するのに
便利なメソッドがあったので記録として残します。# 実際のコード
“`.rb
cookies[:remember_token] = { value: remember_token,
expires: 20.years.from_now.utc }
“`
上記は20年後期限切れになる記憶トークンです。
これをメゾットを使うことで
“`.rb
cookies.permanent[:remember_token] = remember_token
“`
のように書くことができます。
[Rails7]submitにつけるdisable_withオプションについて
## はじめに
Rails7以前までは[[Rails]submitタグにつけておきたいdisable_withオプション](https://qiita.com/sue738/items/09f569bdc3a73d26df88)の記事にあるように、data属性に`disable_with`を付与すれば、二重送信が防止できておりました。
“`slim
= form_with(model: model) do |form|
= form.submit ‘登録’, { data: { disable_with: ‘登録中・・・’ }
“`ですが、Rails7移行では、`disable_with`オプションが機能しなくなっているので、どのように実現したかを残しておきます。
## どう変わったのか
[Rails 7.0 + Ruby 3.1でゼロからアプリを作ってみたときにハマったところあれこれ
](https://qiita.com/jnchito/items/5c41a7031404c313da1f#disable_with%E3%81%AE%E6%8C%87%E5%AE
ActiveHash
# ActiveHashとは
カテゴリー名などの、変更される予定の無いデータをモデルファイルに記入することで、データベースに保存することなくActiveRecordのようなメソッドを使用することができるようにするGemのことです。# なぜActiveHashを使用するのか
ActiveHashを使用する理由は、データベースへのクエリと比較すると負荷が小さく、アプリケーションのパフォーマンスへの影響が少ないと考えられるからです。ActiveHashを使用した場合データはメモリ上に保存され、データベースに保存するよりも、高速でデータの取得を行うことができます。
# インストール方法
Gemfileの最下部に以下の内容を追加します。
“` :Gemfile
gem ‘active_hash’
“`
ターミナルで実行します。
“`
bundle install
“`# 使用方法
ActiveHashを使用するために、まずはモデルを作成します。(今回はCategoryモデル)
“`
rails g model category
“`
ActiveHash::Base