- 1. Googlemap geocodingが動作しない
- 2. 【Rails, MySQL, ORM】where(‘user.id’: 1)ってことができる
- 3. DHH流のルーティングの書き方
- 4. 【Rails6.1】番環境で発生したMysqlのサブクエリに関するエラーを解消
- 5. 【Docker】DockerでRailsのデバッグを実行する【Rails】
- 6. Rails:パーシャルでインスタンス変数を使用してはいけない理由
- 7. Railsヘルパー
- 8. rails7にsotalbeを実装
- 9. 未ログインユーザーの閲覧数カウント
- 10. 一覧画面に検索機能実装 Rails ransack
- 11. TypeScriptの新しいORMに同期APIを採用した理由
- 12. 【Rails6.1】同じUser同士じゃない場合のDM機能(課題は残る)
- 13. 【Rails6.1】2種類のレイアウトを使ったブックマークを非同期にする方法
- 14. [Rails] エラーメッセージを日本語で設定する
- 15. Railsでいいね機能:ビューファイル中で使用しているいいね判定メソッドでn+1問題が発生した時の対処法
- 16. railsでdistinctとin_batchesを同時に利用するのはアンチパターン
- 17. クラスにモジュールを取り込むinclude、prepend、extendの違いと比較
- 18. Rubyのクラスメソッドとインスタンスメソッドの概念
- 19. Javascriptを使用してフォームを何個も追加
- 20. Action View Bug Report with View Paths
Googlemap geocodingが動作しない
# はじめに
ポートフォリオ制作中です!
今回はデプロイ後のGoogleMapとGeocodingがうまく動作しなかったため本番環境でも動作せず、開発環境でdb:seedし直すと開発環境でも動作しなくなってしまったため、解決方法をまとめておきます!
# エラー状況
本番環境でも、開発環境でも、rails db:seedすると下記のエラーが出るようになった
“`
$ rails db:seed
Google API error: request denied (API keys with referer restrictions cannot be used with this API.).
“`
また、Googlemapは表示されるが、緯度経度が正しくないため変な場所にピンが刺さっている(Google Mapが表示されない問題もありましたが、本番環境ウェブサイトのURLを許可してないだけだった)# 原因
このエラーはコードの問題ではなく、APIの制限設定によるものですhttps://developers.google.com/maps/faq?hl=ja#brow
【Rails, MySQL, ORM】where(‘user.id’: 1)ってことができる
業務開発でRailsを使用しており、ORMもよく使用しているのですが、業務開発を通して知った `where` 句の文法的なのをここで紹介していきます。
## where(column: value)
これはRailsのwhere句の一番オーソドックスな書き方だと思います。
whereをメソッドチェーンで繋げていけば `and` 句となり条件をより絞ることができます。
“`ruby
# e.g.
User.where(id: 1)
User.where(gender: “man”).where(name: “hoge”)
“`## where(column: [value])
これはいわゆる `where in` 句の書き方で、 `or` 検索をかけたい時は基本的にこの書き方が一番いい気がします。
若干話が変わりますが、SQLアンチパターンにおいて、 `or` 検索はインデックスが効かない `where` 句の書き方ですが、 `where in` 句はインデックスが効く書き方なので、もし `or` のような**和集合条件**でインデックスが効く検索をしたい場合は **`wher
DHH流のルーティングの書き方
今回は私が現場で使用しているルーティング構成について自分のメモとしてまとめました。
## DHH流ルーティングとは?
DHH流ルーティングとは、Railsの創始者であるDavid Heinemeier Hansson(DHH)の提唱するルーティング設計の方法論です。DHH流ルーティングでは、リソースに対して標準的なCRUD操作(Create, Read, Update, Delete)を簡潔に定義し、カスタムアクションやネストリソースを最小限に抑えることで、ルートの複雑さを減らして記述を行うというものです。
つまり、デフォルトCRUDのindex , show, new, edit, create, update, destroyメソッドのみですべてを表現するということです。
## 具体的な設定例
### ・ 例1
“`
namespace :admins do
root ‘dashboards#index’resources :staffs
resources :users do
resource :enable, only
【Rails6.1】番環境で発生したMysqlのサブクエリに関するエラーを解消
# はじめに
デプロイを行った際にSQLでエラーが発生しました。:::note alert
ActionView::Template::Error (Mysql2::Error: This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME subquery’):
:::# エラーの内容
>Google翻訳より…
>このバージョンの MySQL はまだ「LIMIT & IN/ALL/ANY/SOME サブクエリ」をサポートしていませんLIMIT句が使用されている箇所の構文が、MySQLのバージョンで使用できない記述になっているようです。
さらにエラーメッセージを見ると、以下のビューを表示する際に引っかかっているようでした。
“`html:ショップ(Shop)詳細(show)のビューページ
<%= image_tag @shop.get_shop_image(500,500), class: "w-100 p-1" %>
<%= render 'public/favorite_shops/btn',
【Docker】DockerでRailsのデバッグを実行する【Rails】
## やりたいこと
Dockerで実行しているRailsアプリケーションのデバッグを実行する## なぜ行うか
設定なしにbinding.pryをソース内に記述しても止まらないため、以下の設定が必要。## 方法
1. docker-compose.ymlに下記を追加“`yml:docker-compose.yml
web:
# 以下を追加する
tty: true
stdin_open: true
“`# ターミナルで実行しているdockerにattachする
“`docker:
# 起動しているdockerのコンテナ名を調べるため、以下を実行
$ docker ps
# 調べたコンテナ名を利用して、docker環境にattachする
$ docker attach コンテナ名
“`## 最後に
上記を行うとdocker環境でpry-byebugを利用したデバッグを利用できます。
Rails:パーシャルでインスタンス変数を使用してはいけない理由
### 読んで欲しい人
– パーシャルにインスタンス変数を書いてエラーになった人
– 過去の自分### 動作環境
– MacOS 14.5
– ruby 3.3.0
– Rails 7.1.3.3
– psql (PostgreSQL) 14.11### 課題
– 下記のコードにレビューをいただいた“`ruby:_post.html.haml
# パーシャルファイル
.p-4.d-flex.flex-column.justify-content-center.mt-6
.post-container.p-3
.mb-3
= @user.name
“`レビュー内容: パーシャルでインスタンス変数をつかわないように
### なぜダメか
**理由1**
そもそもパーシャルの利用目的は、
**viewの一部を切り出して、再利用するためのもの**
なので、
インスタンス変数をパーシャルの中で使用してしまうと、他の部分で再利用ができない。**理由2**
キャッシュの効率が悪い
Railsではパーシャルを呼び出すタイミング(render)
Railsヘルパー
“`.rb
# ページごとの完全なタイトルを返す
def full_title(page_title = ”)
base_title = “Ruby on Rails Tutorial Sample App”
if page_title.empty?
base_title
else
“#{page_title} | #{base_title}”
end
end
“`
のようなヘルパーを作成することで“`.application.html.erb
<%= full_title(yield(:title)) %>
“`
で呼び出すことができる
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