- 1. find find_by whereメソッドの違いについて
- 2. JavaScriptでiOSのクリップボードにコピー-RilsTIL(1h)
- 3. Ruby Silver勉強の参考に
- 4. VSCodeでRubyの環境構築
- 5. RailsでSass自動コンパイル, assetsの設定 – RailsTIL(4h)
- 6. ActiveRecord::ConnectionNotEstablished connection to server on socket “/tmp/.s.PGSQL.5432” failed: fe_sendauth: no password suppliedの対処例【Rails】
- 7. 要素のないもののループ処理は走らない
- 8. ステージングされていない変更を破棄してブランチを移る
- 9. クラウド環境構築(github-codespaces)
- 10. 【Ruby on Rails】トランザクション内で定義した変数をトランザクション外でも使う方法
- 11. JSONからパターンマッチで欲しい情報をサクッと取り出す
- 12. dockerで一回コンテナから出てから作業して、また入り直す。
- 13. 【デイトラ】Webアプリ開発コースで作成したRailsアプリをRender.comでデプロイする方法
- 14. Railsでto_paramメソッドが呼び出せない
- 15. ActiveModelSerializerを触ってみた
- 16. counter_cacheの導入と使い方
- 17. 【初心者向け】Ruby on Rails webサイトへの表示について
- 18. Raspberry PiにRailsサーバーを立てて運用する
- 19. Rspec で特定種類のテストだけを対象に before / after を設定する例
- 20. 【Ruby】文字列の長さを調べる方法
find find_by whereメソッドの違いについて
レコードの検索時にfind find_by whereメソッドを使用していますが、
なんとなくフィーリングで使っていたので、それぞれの違いについてまとめてみました。
# findメソッドfindメソッドは、レコードの主キー(ID)を指定して、1件または複数のレコードを返します。重要なのは、findメソッドは与えられたIDに対応するレコードが存在することを前提としており、IDが存在しない場合は例外(ActiveRecord::RecordNotFound)が発生します。つまり、nilを返さずにエラーになります。
“`ruby:sample.rb
#IDが1のユーザーを取得
user = User.find(1)
User Load (0.6ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
`=> #
JavaScriptでiOSのクリップボードにコピー-RilsTIL(1h)
## iOSのクリップボードにコピーする
“`javascript:clipboard_controller.js
import { Controller } from “@hotwired/stimulus”;export default class extends Controller {
copy(event) {
event.preventDefault();
// ここにデータをfetchして加工するプログラムを記述
copyClipBoard(resData); //取得したデータをcopyClipBoardにわたす。const copyClipBoard = (targetValue) => {
if (navigator.clipboard) {
navigator.clipboard
.writeText(targetValue)
.then(() => {
alert(“Successfully copied”);
Ruby Silver勉強の参考に
先日Ruby Silverの試験に合格できたので勉強時に暗記した内容の一部です。
### 破壊的メソッド
“`
concat
pop
shift
unshift
push
delete_if
clear
“`### 別名など
“`
delete_if → reject!
update → merge!
find_all → select
collect → map
member? → include?
select → find_all
find → detect
“`本当に一部ですが覚えておくと試験で4~6点くらい正解できると思います!
頑張ってください!
VSCodeでRubyの環境構築
# はじめに
こんにちは、見習いエンジニアのkaitoです!今回はRubyの環境構築を書いていきたいと思います。私は長期インターンでクラウドのAWSを使ってrubyを書いていましたが、VSCodeでは書いたことがないので、勉強のつもりで記載していきます!
## 1. VSCodeのインストール
以下のサイトからVSCodeをインストールしてください⬇︎https://code.visualstudio.com/Download
## 2. VSCodeの環境構築
左端にある上から5番目のアイコンを押して、検索でrubyと入力する。
するとrubyの拡張機能が出てきますが、推奨されていないため、代わりに`Ruby LSP`をインストールしてください。次に検索に`Code Runner`と入力し、インストールしてください。
![スクリーンショット 2024-09-28 20.03.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3886699/dd5120e7-8209-7c30-44
RailsでSass自動コンパイル, assetsの設定 – RailsTIL(4h)
## tailwindとSass(dartsass)を使う
– tailwindcssをrailsにインストールすると、dartsassの自動ビルドが効かなくなるため
– dartsassの自動コンパイル設定を追記します
“`diff_ada:Procfile.dev
web: bin/rails server -b 0.0.0.0 -p 3200
css: bin/rails tailwindcss:watch
+ css: bin/rails dartsass:watch
“`## 表示が変わらない・おかしいとき
– public/assetsの内容を全て削除
– rails assets:precompile実行時に生成され、表示に優先されます。開発時は要りません。## それでもおかしいとき
– application.scssの内容をメモ帳にコピー、そして以下2つのフォルダ内容をすべて削除
“`
app/assets/stylesheets
app/assets/builds
“`
– 再インストールしてファイルを生成
“`
rails tailwindcss
ActiveRecord::ConnectionNotEstablished connection to server on socket “/tmp/.s.PGSQL.5432” failed: fe_sendauth: no password suppliedの対処例【Rails】
## はじめに
Ruby on Railsにて、以下のエラーが発生しました。
“`ruby
ActiveRecord::ConnectionNotEstablished connection to server on socket “/tmp/.s.PGSQL.5432” failed: fe_sendauth: no password supplied
“`## TL;DR
ローカルでRailsアプリをPostgreSQLを使用して作成していた際に、別のPostgreSQLのプロセスが残っていたために起きました。
該当プロセスを使用していないことを確認して、killしたあとに再実行することで解決しました。
## 手順
以下のコマンドを実行して、稼働しているPostgreSQLのプロセスIDを取得します。
“`jsx
$ sudo lsof -i:5432
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
postgres 600 postgres 7u IPv
要素のないもののループ処理は走らない
当たり前の話だけどeachメソッドでループ回す際に、要素がないとループ処理は走らない。
“`rb
def hoge
[].each do |i|
p i
end
endhoge
p “fuga” # fuga
“`![スクリーンショット 2024-09-28 17.44.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492674/290a8b1b-3068-9d6a-25fc-adb8ce88ec1c.png)
なので、eachの中で要素がない場合はどうなる?のテストは不要
ステージングされていない変更を破棄してブランチを移る
# ブランチを移動したいけど変更したところを戻せなくて移動できない!
となったことはありませんか?:::note alert
gitでは、衝突する変更を含む場合はブランチを移ることができません
(衝突しないなら可能)
:::チーム開発の際、余計な変更も含めてcommitしてしまうと、
変更履歴が汚くなってしまいます😭# 指針としては
:::note info
・変更を保持したまま、ブランチを移る
・変更を破棄してブランチを移る
:::
この二つがあると思います。# 変更を保持したまま、ブランチを移る
*変更を一時保存する*
“`
git stash
“`
*ブランチを移動する*
“`
git checkout 移りたいブランチ名
“`
*必要に応じてstashした変更を戻す*
“`
git stash pop
“`
# 変更を破棄して、ブランチを移る
*変更を破棄する*
“`
git checkout — .
“`
*ブランチを移る*
“`
git checkout 移りたいブランチ名
“`
(まあGPTに聞けば出てくることではあるんですけどねw)
クラウド環境構築(github-codespaces)
## 環境構築をクラウドで簡略化しよう!
githubのサービスで無料枠のクラウド上に環境構築が出来るサービスがあった。
これを使用すれば、rubyとrailsやその他ライブラリなどで発生するバージョンでの交互関係のエラーを
解消できるという。
コード記入はVScodeのような操作性!
個人アカウントでは、15GBのストレージと1ヶ月に120Hが無料枠で使える。
環境構築でさんざん苦しみ、初学者たちが苦しんできた事実を鑑みればとても有益にみえる。早速、githubでリポジトリ新しく作成。
githubのメイン画面からcode→codespaceタブ→openingcodespace
で作成が出来る。“`
rvm list
“`ダウンロードのバージョンを確認。
適用したいのはruby3.0.1なのですがリストにありませんでした。
rvmでダウンロードします。“`
rvm install ruby 3.0.1
“`rials もダウンロード
“`
gem install rails v-7.0.0 -N
“`“-N”でドキュメントのダウンロードを
【Ruby on Rails】トランザクション内で定義した変数をトランザクション外でも使う方法
# はじめに
仕事でRuby on Railsを用いてバックエンド開発を行っているのですが、その中でトランザクション内で定義した変数をトランザクション外で使いたいケースが出てきたので、その方法について共有します。
# インスタンス変数を使う
その方法とは、「**インスタンス変数を使う**」ことです。インスタンス変数とは、`@hogehoge`といったように、変数の前に`@`を付与した変数になり、ブロックの外でも変数を使用したいときに用いられます。
ブロックの外でインスタンス変数を使う用途として
* クラス内のメソッドで定義された変数に対して、インスタンスを生成することで別のメソッドでも利用できるようにする(詳細記事は[こちら](https://qiita.com/mary_new_programmer/items/4c4353c3d1df7242f515))
* Controllerファイルで定義した変数をViewファイルでも利用できるようにする(詳細記事は[こちら](https://zenn.dev/ganmo3/articles/58c1f44fa50831))
が代
JSONからパターンマッチで欲しい情報をサクッと取り出す
Webhookのレスポンス(JSON形式)から特定の値だけを取り出したいときにパターンマッチをつかうと便利だったので紹介します。
:::note info
以下を `irb` で直接打ち込みながら動作確認できます
::::::note warn
正常系・異常系を書く場合、case-inを使うほうが適切な場面もあります。
決まったレスポンスを扱うときや、取得できなかった場合の適切なエラーハンドリングをおこなう前提で使うようにすること。
:::# シンプルなkey/value
“`rb
json = {
“id”: 1,
“name”: “John Doe”,
“email”: “johndoe@example.com”,
“registered_at”: “2024-01-15T10:30:00Z”
}
“`## nameとemailだけほしい
“`rb
json => { name:, email }name
=> “John Doe”
=> “johndoe@example.com”
“`# 配列の先頭の住所を取得す
dockerで一回コンテナから出てから作業して、また入り直す。
# コンテナから出て作業するのってどうすれば?
と思ったので書こうと思いました。結論としては、*コンテナ内から出る*
まず、現在コンテナ内にいる場合は、exit コマンドを実行してシェルを終了し、ホストマシンに戻ります。
“`
exit
“`
/ここで諸々作業する*再度コンテナに入る*
その後、以下のコマンドを使って、元の作業していたコンテナに再度入ります。
“`
docker exec -it コンテナ名 /bin/sh
“`
### 流れ
– exit でコンテナ内のシェルから抜ける。
– コンテナが実行中であれば、*docker exec -it コンテナ名 /bin/sh* で再度シェルに接続できる。
これで問題なくコンテナ内に再度入れます!
【デイトラ】Webアプリ開発コースで作成したRailsアプリをRender.comでデプロイする方法
## はじめに
いま受講しているデイトラのWebアプリ開発コースでは、合計3つのアプリを作成します(ハンズオンで作成するアプリ + 課題として作成するアプリ × 2)ハンズオン形式でレクチャーされているデプロイ方法はherokuです。
PostgreSQLのアドオンをそれぞれのアプリに使用する必要があるため、
各アプリごとに$5/月かかってしまう計算になります。気持ち的にそのお金があるなら技術書を買いたいので、Renderを使ったデプロイに挑戦してみました。
### 開発環境
– Ruby 2.7.7 => 3.1.0*
– Rails 6.0.6.1 => 6.1.7.8*
– node.js v14.16.1
– PostgreSQL 14
– Windows11
– WSL2(Ubuntu)*もともとのバージョンが古く、Renderでのデプロイに対応していなかったため、アップデート作業が必要になりました
### デプロイまでの流れ
1. デプロイ用の設定(S3の設定など)
1. Renderの登録・設定
1. RubyとRailsのバージョンアップ対応
1. R
Railsでto_paramメソッドが呼び出せない
## 概要
SEO対策の一環として、RailsアプリケーションのURLに含まれる`id`を固有名詞に置き換える実装を行いました。
例えば、以下のようなケースです。“`ruby
# これを
https://spocale.com/fruit/1
# 以下の形式にしたい。
https://spocale.com/fruit/apple
“`
フルーツに関する一覧ページがあり、そこから「りんご」を選択して詳細ページに飛ぶ場合を想定します。このとき、URLの`id`部分を`apple`という固有の文字列に変えたいとします。ただし、既存のURLを突然変更すると、ブックマークなどで保存されている従来のURLが使えなくなる可能性があります。そこで、id付きの従来のURLも維持しつつ、新しい形式のURLも利用できるように実装しました。この記事では、その過程で直面した課題と解決方法についてまとめます。
## 対象読者
– Railsアプリケーションでid付きのURLを固有名詞で表示する方法
ActiveModelSerializerを触ってみた
# はじめに
ActiveModelSerializerを業務で使ったのでざっくりと使い方をまとめようと思います。
誤り等ございましたら、コメントいただけるとありがたいです。# セットアップ
#### インストール方法
– Gemのインストール手順
“`ruby
gem ‘active_model_serializers’, ‘~> 0.10.0’
“`
出力されるjson構造を変更したい場合(defaultはattributes),
config/initializers/active_model_serializers.ファイルを作成し,
“`ruby
ActiveModelSerializers.config.adapter = :json_api
“`
を記述します。#### active_model_serializerとは
– ActiveModelSerializerの概要
ActiveModelSerializerはrailsアプリケーションを簡単にjsonシリアライズするためのgemですシリアライズとは、(W
counter_cacheの導入と使い方
この記事はプログラミング学習者がアプリ開発中に躓いた内容を備忘録として記事におこしたものです。内容に不備などあればご指摘頂けると助かります。
## 記事投稿の背景
この記事ではXのクローンサイトを作成中にBulletで検知したN+1問題を解決するために実装した内容を紹介します。
機能としては投稿に対するいいねとコメントの数を集計して表示させる機能に関する内容です。
実装当初の内容と修正後の内容を掲載したいと思います。## 実装当初のコード
“`ruby:tweet.rb
class Tweet < ApplicationRecord belongs_to :user validates :content, presence: true, length: { in: 1..140 } has_many_attached :images has_many :favorites, dependent: :destroy has_many :comments, dependent: :destroy has_many :retweets, dependent:
【初心者向け】Ruby on Rails webサイトへの表示について
現在、デイトラでWeb開発を学んでおり、その学習において、学んだことを共有させていただきます!
現在は、Ruby on RailsでWebサイトを作成中です。
![スクリーンショット 2024-09-25 15.09.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894345/650a3c5b-d9bd-c4a2-af14-ce07b232e71e.png)
どうやってこれらの文字を表示しているのでしょうか?
“`routes.rb
Rails.application.routes.draw do
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
get ‘/’ => ‘home#index’
end
“`
ブラウザから get ‘/’ リクエストがきたら、routes.rbで処理が開始され、home#indexが実行されます
Raspberry PiにRailsサーバーを立てて運用する
![P_20240924_172516.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72890/ea5e1765-6b95-a2c9-7e62-19679f63e5c9.jpeg)
# 初めに
家庭内で家族が使えるお小遣いアプリをRuby on Railsで作っているのですが、少しでも維持費を抑えるためにRaspberry Piを自宅サーバーにしてその上で動かすことにしました。
ただし、今回はあくまで自宅内でのサービス限定とし外部には公開しません。# 前提条件
– Raspberry Pi 5を使用
– OSインストール、初期設定、ネットワークの設定は済んでいる
– 消費電力を抑えるために無線LANはOFFにしている
– sshで接続できるようになっている# 下準備、環境アップデート
“` bash
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo rsi-update
sudo rpi-upda
Rspec で特定種類のテストだけを対象に before / after を設定する例
# 例
system test の全てのテストケースを対象に `before(:each)` の処理をさせる場合
`rails_helper.rb` に以下を設定
“`rb
RSpec.configure do |config|
config.before(:each, :type => lambda { |spec_type| spec_type == :system}) do
…
end
end
“`# チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。
https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ
# プロフィール・経歴
https://github.com/YumaInaura/YumaInaura
【Ruby】文字列の長さを調べる方法
文字列の長さを調べるには`length`メソッドを使用します。
## 基本的な使い方
`length`メソッドは、以下のように使用します。
“`ruby
# 文字列の長さを取得
string = “Hello, World!”
puts string.length # 出力: 13“`
空白や特殊文字もカウントされます。
“`ruby
string_with_spaces = ” Ruby ”
puts string_with_spaces.length # 出力: 8
“`## 配列の要素を数える
配列に対して`length`メソッドを使用すると、その配列に含まれる要素の数を返します。
“`ruby
empty_array = []
puts empty_array.length # 出力: 0mixed_array = [1, “two”, :three]
puts mixed_array.length # 出力: 3
“`## `size`メソッド
`size`メソッドも`length`メソッドと同様に使用できます。
“`r