Rails関連のことを調べてみた

Rails関連のことを調べてみた
目次

params[:id]とprivateで定義して取得するparamsの違い

## 初めに

疑問に思ったことや上手くいかなかったことのアウトプットをしています。
自分なりの理解でアウトプットしていきます。初学者なので誤りもあると思います。
その際はご指摘いただけると幸いです。

## 疑問に思った点
コントローラでparamsの記述するときはprivateで定義をして取得している時があります。
“`
private

def xxxxx_params
params.require(:user).permit(:email)
end
“`

なのに
“`
@token = params[:id]
“`
と記述するだけで取得できるコードもあります。違いはなんでしょう。

## 調べた結果
params[:id]とxxxxx_paramsでの違いはAPIで送られるデータかそうでないかです。
idはAPIリクエストの一部として送信されるので、pramas[:id]で取得できます。
モデルから取得する必要があるデータと、直接送られてくるデータで区別をしています。

元記事を表示

個人で路上ライブマッピングサイトを作りました

この記事を見てくださりありがとうございます。今回、路上ライブが開催される場所を地図上にマッピングして集客できるようなWebアプリケーションを作ってみました。以下のリンクから
https://livespot.onrender.com/

![スクリーンショット 2024-09-06 18.55.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768119/56e31ffb-d42a-a082-5ad0-b2883a8f5ae8.png)

# 1. Webアプリの目的
大学で音楽活動をしていて、何かインディーズ界隈に貢献できるサービスを開発できないかと考えていたときに「路上ライブ」に目をつけました。私が考える路上ライブの課題及び改善点として、「集客のしにくさ」が第一に挙げられます。この課題を解決する手段として、POKEMON GOのようなマッピングサービスが有効だと考えました。作ったアプリ(Livespot)ではアーティストはユーザー登録を行えばアプリ内でアーティストアカウントをもち、ライブを行

元記事を表示

RubyでprivateメソッドをRspec等で呼び出す方法

# 結論 sendメソッドを使おう!

“`
class User
def greet(name)
“Hello, #{name}!”
end

private

def secret_method
“This is a secret!”
end
end

user = User.new
puts user.send(:greet, “Alice”) # => “Hello, Alice!”
puts user.send(:secret_method) # => “This is a secret!”
“`

元記事を表示

Rubyの配列とか、ハッシュとか、、、

## 始めに・・・
先日後輩のコードレビューをしていた際に「ハッシュがさぁ!ハッシュがさぁ!」と先輩ぶっていたが単純に配列だったという悲しいことを晒したので懺悔の意味も込めて、、、

## 配列とは、、、
配列とは複数のデータを纏めて格納できるオブジェクト
“`ruby
#空の配列
[]
#サンプル
[‘配列1′,’配列2′,’配列3’]
#クラスはArray
[].class #=> Array

#サンプル
irb(main):003> a = [‘配列1′,’配列2′,’配列3’]
=> [“配列1”, “配列2”, “配列3”]
irb(main):004> a[0]
=> “配列1”
“`

主にRailsだとeachで使う気がする
“`Ruby
numbers = [1,2,3,4,5]
irb(main):009> sum = 0
=> 0
irb(main):010* numbers.each do |n|
irb(main):011* sum += n
irb(main):012> end
=> [1, 2, 3, 4, 5]
irb(main):013>

元記事を表示

【Rails7 とLaravel10】routerを担うファイルの記述方法比較

## 前提
両者Postモデル、Postコントローラーを作成してあります。基本的なcrudを実装する想定です

## router

routerという表現が正しいか微妙ですが,ルーティングのことです。Railsでは`routes.rb`,Laravelでは`web.php`が該当します。

`routes.rb`
“`routes.rb
Rails.application.routes.draw do
namespace :api do
namespace :v1 do
resources :posts, only: [:index,:show,:create,:update,:destroy]
end
end
end
“`

`api.php`
“`api.php
use Illuminate\Support\Facades\Route;

Route::prefix(‘api/v1’)->group(function () {
Route::get(‘posts’, [PostControl

元記事を表示

文字列をTrue or Falseに変換する

#### 環境

Ruby2.6
Rails4.0

#### Booleanの判断の仕方

RubyにはBooleanClassというは存在していません。その代わり、FalseClass、TrueClassというのが存在します。なぜ、そのような設計をしたのだろうか。他言語から移行した人からしてみれば訝しく思うのも無理はない。

Boolean型つまり、FalseClassかTrueClassかの判断は、このようなやり方で判断することになります。

“`sample.rb
if params.is_a?(FalseClass) or params.is_a?(TrueClass)
puts “いわゆるBoolean型です”
else
puts “いわゆるBoolean型ではありません”
end
“`

#### テスト結果

“`test.rb
params = true # いわゆるBoolean型です
params = True # エラーになります
params = TRUE # エラーにはならないがwarningになる(

元記事を表示

Railsでunknown Statement of type “ForOfStatement” のエラーが起きたときの解消法

## サマリ

### 何が起こったか
`axios`導入後、コンパイルエラーが発生しました。
具体的なメッセージは以下のとおりです.

“`
Failed to compile.
./node_modules/axios/lib/helpers/trackStream.js
Module build failed (from ./node_modules/babel-loader/lib/index.js):
Error: /home/omi/blog-app/node_modules/axios/lib/helpers/trackStream.js: unknown Statement of type “ForOfStatement”
“`

### 何をして解消したか
プロジェクトルートディレクトリ直下の`.browserslistrc`ファイルに`IE 11`と記述しました。

“`
// .browserslistrc

defaults
IE 11
“`

## 詳細
### 開発環境
– Rails: 6.0.6.1
– Node.js: 14.16
– webp

元記事を表示

Gitでマジでしたらあかんこと

今回は、Git/Githubでマジでしたら終わることについて紹介したいと思います。(実務で自分が怒られたこと中心)
初心者向けの備忘録なので、初めたてじゃないよって人は読まなくていいかもです。

# master/mainブランチのまま変更する or masterにpushする
これまじやばいです。自分の変更がmasterと同期するってことなので、conflict発生したら詰みます。
あと破壊的な変更を戻せなくなります。
“`
git push origin master
“`
これだけは禁止!!!!!!!!!!!!!!!(一回やった)

# リモートの変更を反映しないままbranchを切る
“`
git pull origin master
git branch -c ブランチ名
“`
これらは二つでセットであることは覚えておきましょう

# メイン以外からブランチを切る
例えば、
“`
git branch -c feature/newbranch
“`
でブランチをメインから切り、変更してコミットしたのちに、別のissueに取り組みたくなって(or自分のプロジェクトな

元記事を表示

Railway CLIでRails開発中にDatabase ‘railway’ does not exist

# はじめに
Herokuまわりのゴタゴタがあって、個人開発はRailwayを使うようになったのですが、ちょっと困ったことがあり、自分用メモとして残しておきます

# db:migrate:resetができない?
開発の初期って、DBの設計が決まっていなくて、実装していくうちに、あ、あれ足りなかったな。
ということは多いでしょう。

そんなとき、結構気軽にマイグレーションを一からやり直すコマンド

“`
rake db:migrate:reset
“`

をしたらいいか!くらいのノリで個人開発をやっているのですが、ちょっと問題が発生しました。

“`
% railway run rake db:migrate:reset
Database ‘railway’ does not exist
We could not find your database: postgres. Which can be found in the database configuration file located at config/database.yml.

To resolve this i

元記事を表示

長距離ドライブをサポートするアプリを作成しました

## はじめに
こんにちは!
[ジョニー](https://x.com/johnny1_ryo) と申します。
未経験からエンジニア転職を目指して、日々学習をしています。

この度、[kodora-co-driver](https://www.kodora-co-driver.com/) を開発しました。

## サービス名 : kodora-co-driver
Image from Gyazo

▼ サービスURL

https://www.kodora-co-driver.com/

▼ Githubリポジトリ

https://github.com/johnny23ryo/kodora-Co-Driver-

## アプリ名の由来

アプリ名「kodora-co-driver

元記事を表示

Rails ネストした配列のJSONに対してStrong Parameterを適用する

Rails: Applying Strong Parameters to Nested Array JSON

フロントエンドで整形したJSONをRailsのエンドポイントで受け取る際に、Strong Parameterの設定で少しハマったので備忘録として記載

環境は以下
* Ruby 3.1
* Rails 6系

# Strong Parameterの中で配列を扱う(文字列の配列)

参考)https://blog.ryskit.com/entry/2024/01/13/020409

“`json:requestのJSONの構造
{
“user”: {
“stringArray”: [
“aaa”,
“bbb”
]
}
}
“`

この構造に対してStrong Parameterを適用する場合、以下のように記述する。
配列であることを明示するだけで良い。

“`ruby:動作するStrong Parameter
params.require(:user).permit(stringArray: [])
“`

#

元記事を表示

【Rails7】button_toの挙動の変更の対応

## 問題
Rails6.1までは、button_toで生成されるHTMLはinputタグでしたが、Rails7からbutton_toでHTMLのbuttonタグが生成されるようになりました。
これにより、アップデート前に設定していたinputタグのCSSやJavaScriptが効かなくなります。

## 解決方法
CSSなどのinputタグをbuttonタグに変更することで対応できますが、以下の設定をconfig/application.rbに入れることで、button_toがRails6.1までの挙動に戻ります。
“`ruby
class Application < Rails::Application config.action_view.button_to_generates_button_tag = false end ``` ## 参考 https://blog.saeloun.com/2021/08/24/rails-7-button-to-rendering/

元記事を表示

Railsでプロジェクトルートディレクトリのパスから辿れるようにする

# 概要
– スクリプトを実行するときに外部ファイルが必要な場合が多々ある
– どこに置く?となると、`~/tmp/` が良いんじゃなかろうかと
– https://railsdoc.com/rails_base
– スクリプトからどうやって取得する?で教えてもらった話の備忘録

# 結論

`Rails.root.join` を利用しましょう

“`ruby
csv_path = Rails.root.join(‘tmp’, ‘file_name.csv’)
“`

コンソールでいじるとこんなオブジェクトが返ってきます(僕の環境下ではDocker利用しており、プロジェクトルートディレクトリが`/app`にしているので、`/app`が表示されています)

“`ruby
$ rails console
[1] pry(main)> Rails.root
=> #
[2] pry(main)> Rails.root.join
=> #
[3] pry(main)> Rails.root.join(‘tmp’)
=>

元記事を表示

Rails – 間違ったマイグレーションを環境に反映してしまった時のリカバリ方法

# 前提

稼働している環境に対して、間違ったマイグレーションを反映してしまった場合
( PRのマージ先を間違った場合など )

今回は誤ったテーブルを新規作成してしまったケースで考える

# STEP 1 – コードの修正

まずは誤ったコードをRevertするなどして、正しい状態に戻してデプロイする

最低限 `schema.rb` に記録されている「最新のマイグレーション時刻」は元に戻す必要がある

“`diff
– ActiveRecord::Schema[7.2].define(version: 2024_09_06_123701) do
+ ActiveRecord::Schema[7.2].define(version: 2024_09_05_100123) do
“`

# STEP 2 – DBのリカバリ

DBを正しい状態に戻す

この例ではSQLを直接実行して、誤って作られてしまったテーブルを削除する

“`sql
DROP TABLE IF EXISTS example_table
“`

Rails経由で実行する場合は rails console /

元記事を表示

【Rails】accepts_nested_attributes_forを使わないとbefore_saveで孫モデルのオブジェクトをビルドしても保存できない

## はじめに

Railsで関連モデルを保存する際の挙動に詰まったため、備忘録としてまとめます。

※この実装は不採用としたので、あまり細かくは調査していません。

この記事におけるバージョンは **Rails 7.2.0** です。

## 問題

実装方針の1つの選択肢として、諸々の事情から下記のように親モデルの`before_save`で子モデルと孫モデルをビルドする方法を検討していました(コールバックは本当は避けたい、、、)

“`ruby:app/models/parent.rb
class Parent < ApplicationRecord has_many :children, dependent: :destroy validates :title, presence: true before_save :build_child # 管理者ID ADMIN_USER_ID = 1 # 子モデルと孫モデルのオブジェクトをビルド def build_child child = children.build( tit

元記事を表示

Railsでwebpack-dev-serverが起動できないエラー

## はじめに
デイトラWeb開発コースを進めている中でwebpack-dev-serverが実行できず、めちゃくちゃ解決に時間をかけてしまったため、原因と解決策を残しておきます。
時間はたくさん使ってしまいましたが、一方で理解が深まった面もあるので、その点も最後にアウトプットします。

## 問題
Railsのプロジェクトで`bin/webpack-dev-server`を実行すると、`Command “webpack-dev-server” not found.`のエラーが出る

## 原因
node.js,rails/webpacker,webpack,webpack-dev-server,webpack-sliの互換性がない

## 解決策
package.jsonに以下を記載
“`
“engines”: {
“node”: “14.16”
},
“devDependencies”: {
“webpack”: “4.x.x”,
“webpack-cli”: “3.x.x”,
“webpack-dev-middleware”: “3

元記事を表示

[Ruby on Rails]enumerize gemでoptionsを絞り込みたい場合

## enumerize gemについて

Ruby on Railsでenumを使いたい時に便利なGem
https://github.com/brainspec/enumerize

ざっくり使い方

“`ruby
class User
extend Enumerize

enumerize :role, in: [:user, :admin, :staff]
end
“`

## 本題: optionsを絞り込みたい場合

enumerizeのoptionsを使用してkey, valueの構造を取得する場合に任意の項目を除外または指定した項目だけを取得したい場合には以下のように指定します。

### 除外したい場合

“`ruby
User.status.options(except: [:admin])
# => user, staffが取れる
“`

### 指定した項目だけ取得したい場合

“`ruby
User.status.options(only: [:user])
# => userのみが取れる
“`

## まとめ

以上、雑ですが忘れそうなの

元記事を表示

[Rails]stubを使うときは評価順序に気をつけた方がいいという話

# はじめに
皆さん`stub`は好きですか?私は正直嫌いです。しかし、外部と通信を行う機能を作成したりする時には切ってもきれない便利な機能です。今回はそんな機能を使うにあたって沼ったポイントがあったので共有していきます。

# 開発環境
– Ruby 3以上
– Ruby on Rails 6以上
– Minitest

# 最初に結論
`Object.new`を`stub`する際は、`.new`される前に引数が評価されるので注意が必要です。

これだけではわかりづらいと思うので、コードで例を見ながら解説します。

# ケーススタディ
以下のような外部とやり取りを行う、`GetterService`があったとします。外部通信を行うのは`GetterClient`なので、テストを行う際は`GetterClient.new`を`stub`することになります。
“` ruby
class GetterService < ServiceBase def call pp '1' data_list = getter_client.fetch_data_list

元記事を表示

Rspecにてcreated_atの検証で失敗する

# はじめに
RspecにてJSON形式のレスポンスデータを検証している際に、
`created_at`や`updated_at`にてデータが一致しないことで困っていた

# 困ってたこと

データ形式:
“`ruby
{
‘key’ => ‘value’,
‘created_at’ => ‘instance.created_at’,
‘updated_at’ => ‘instance.updated_at’,
}
“`

Timeオブジェクトはミリ秒の値まで含んでしまっているため、
データが一致せずにテストが落ちてしまう

“`plaintext
# 期待していたデータ
“created_at” => “2024-08-26T10:35:23+09:00”

# 実際に来たデータ
“created_at” => “2024-08-26T10:35:23.000+09:00”

“`

# as_jsonで試してみた

https://railsdoc.com/page/as_json

as_jsonではハッシュ形式に変換してくれるらしい

creat

元記事を表示

DataTaransferオブジェクトを使えばのvalue属性に値をセットするのと近しいことができる

## 背景

JavaScriptで``のvalue属性に値を直接設定することはできません。

これは、セキュリティ上の理由で、悪意のあるスクリプトがユーザーのローカルファイルを勝手にアップロードすることを防ぐためです。
ブラウザはファイル選択ダイアログを通してユーザーが手動でファイルを選択することを要求します。

しかし、``のvalue属性に値をセットするようなことと近しいことをしたくなる場合もあると思います。(かなりマイナーなケースかもしれませんが)

そのような場合に`DataTransfer`オブジェクトが使えます。

私が遭遇したケースでは、RailsのViewテンプレートからReactのファイル選択コンポーネントを呼び出しているパターンで、そのようなことをしたくなりました。

RailsのViewでは[nested_form](https://github.com/ryanb/nested_form)というgemの`nested_form_for`メソッドでフォームが作られており、そのフォームの中

元記事を表示

OTHERカテゴリの最新記事