Ruby関連のことを調べてみた2022年08月07日

Ruby関連のことを調べてみた2022年08月07日

Herokuにデプロイ → エラーメッセージ[ syntax error near unexpected token `(‘ ]

# 概要
Herokuにデプロイしようとしたところ、 syntax error near unexpected token `(‘
と表示され先へ進めなかった。

# 目次
– [環境](#環境)
– [修正前](#修正前)
– [対策](#対策)
– [修正後](#修正後)
– [おわりに](#おわりに)

# 環境
Ruby 3.1.2
Rails 7.0.3
Heroku 7.60.2

# 修正前

“`bin/rails
#frozen_string_literal: true
#!/usr/bin/env ruby
APP_PATH=File.expand_path(‘../config/application’,__dir__)
require_relative ‘../config/boot’
require ‘rails/commands
“`
この状態でデプロイしました。が...
“`エラー画面
bin/rails syntax error near unexpected token `(‘
`APP_PATH = File.expand_pa

元記事を表示

【ドメイン駆動設計】ValueObjectサンプルコード:プリミティブなオブジェクトみたいに振る舞う

## はじめに

DDD(ドメイン駆動開発)に登場するValueObjectをRubyで実装しようとして
コードを書き進めると、プリミティブっぽく振る舞うようにするにはどうすれば良いんだっけ?
と悩むシーンがあったので
どんなメソッドを実装しておくと便利になるのか、サンプルにまとめてみました。

(ValueObject自体の説明はここでは割愛させていただきます)

## ValueObjectの特徴

ValueObjectを実現するには、次の特徴を実装しなければなりません。

– 値は不変(後から変更できない)
– 値が同じなら同一オブジェクトと判断

(単一の値よりも複数の値をひとかたまり(合成物)として扱う方がより効果的)

他にもIntegerやStringなどのプリミティブなオブジェクトと同じような特徴を備えていると便利です。

– 比較演算子で比較できる
– 配列に入れてソートできる
– ハッシュのキーにできる
– 範囲(Range)に使える

## サンプル:年月をValueObjectで表現してみる

年月をValueObjectとして表現します。

– 年と月を渡す

元記事を表示

Ruby 配列を検索して置き換えまたは削除

# 方法
[1] 文字列”hoge”を”hogehoge”に置き換える
“`ruby
array = [“huga”,”hoga”,”hoge”]

# arrayから”hoge”を検索して”hogehoge”で置換
array.map!{|x| x==”hoge” ? “hogehoge” : x}

p array
# 出力結果=> [“huga”,”hoga”,”hogehoge”]
“`
[2] 文字列”hoge”を”hogehoge”に置き換える(非推奨)
“`ruby
array = [“huga”,”hoga”,”hoge”]

# arrayから”hoge”を検索して”hogehoge”で変換
array[array.index(“hoge”)] = “hogehoge”

puts array
# 出力結果=> [“huga”,”hoga”,”hogehoge”]
“`
こちらの方法は検索する文字列がない場合このようなエラーが出る。
![10272050481bd11c4015d899de61beda.png](https://qiita-image-stor

元記事を表示

HTMLの基礎知識(新規投稿:星評価平均)

Step1:詳細ページの平均(Controller)
自分は2つのカラムしか追加していないので、自分のカラム数に合わせてコントローラーを編集

![スクリーンショット (71).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738887/f26fff0a-6a63-f453-b20d-75f435d1c582.png)

“`ruby:controller.rb
def show
@register = Register.find(params[:id])
/追加部分
@regi=@register.overall
@regi2=@register.level
@total=@regi+@regi2
@to=@total/2
/ここまで
end
“`

Step2:詳細ページの平均(View)

“`ruby:show.html.erb

平均:
Rails のコールバックに ActiveSupport::Subscriber を使用する

# この記事は?

– Rails のコールバックに [ActiveSupport::Subscriber](https://api.rubyonrails.org/classes/ActiveSupport/Subscriber.html) を使用する方法を記載します。
– この方法により以下のメリットがあります。
– コールバックの呼び出し元と呼び出し先をより疎結合にすることができる。
– 単体テスト時などコールバックの処理を動かしたくない場合にスキップしやすい。
– [ruby-jp](https://ruby-jp.github.io/) Slack の #support チャンネルの @wakaba260 さんの投稿でこの方法を知りました。ありがとうございます :pray:

# バージョン情報

“`shell
$ ruby -v
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [arm64-darwin21]

$ bin/rails -v
Rails 7.0.3.1
“`

# 方法

以下のモデル

元記事を表示

/usr/bin/env: ‘ruby\r’: No such file or directory 【windows10 / docker】

# 起こったこと

– MacとWindowsで開発しているプロジェクトで、Winを利用して開発をしようとしてdockerを起動したら /usr/bin/env: ‘ruby\r’: No such file or directoryが発生した。
– Macでは何もしなくても普通にdockerが起動する。
– ソースコードを一切変えずに、Win10で起動するとエラーが起こっていた。

# 原因

– Git for Windowsを利用していると、git pull or cloneするタイミングで、改行コードがLFから強制的にCRLFに変更される仕様らしい
– CRLFはWINでは動くけどunix系だと動かない
– そのためdockerで起動すると、改行コードがうまく解釈できずに問題が起こっていた。

# 対処方法

– これでなおった

“`

$ git config –global core.autocrlf input #clone pull時に改行コードをCRLFへ強制変換をしない設定に変更
$ rf -rf your-repo #レポジトリを削除
$ git clone

元記事を表示

Rubyバージョンに合わせて Gemfile.lock を切り替える

# 目次
1. Gemfile で Ruby バージョンごとに分岐させる
2. Ruby のバージョンごとの Gemfile.lock を準備する
3. .gitignore で Gemfile.lock を除外する

# 1. Gemfile で Ruby バージョンごとに分岐させる
Gemfile に下記のような形式で書く
各バージョンに合わせて `RUBY_VERSION == “3.0.2”` は書き換えてください
“`
# coding: utf-8
source ‘https://rubygems.org’

# バージョン判定
use_ruby3 = RUBY_VERSION == “3.0.2”
gemfile_path = “#{__dir__}/Gemfile.lock”

# バージョンに一致した Lock ファイルをコピーする
unless File.exist?(gemfile_path)
if use_ruby3
FileUtils.copy “#{__dir__}/Gemfile3.lock”, gemfile_path
else
FileU

元記事を表示

Rails6でorder(:id)ではなく任意のID順で並び替えたい

## 駆け出しにもわかる簡単な並び替え
はじめまして、1年を経過した駆け出しRailsエンジニアです。
`Model.where()` で取得したリレーションを任意のID順で並び替えたいということがありました。
この記事は**Rails6**向けとなっており、**Rails7**の方は最後の項目だけ読んで頂ければOKです:ok_hand:

それでは早速、下記のような `animals` テーブルを例として進めて行きます。

ID|名前(必要な情報)|年齢(不要な情報)
—|—|—
1|taro|2
2|hanako|7
3|jiro|4

## まずはID順に並べる場合

“`rb
animal_ids = [1, 3, 2]
Animal.where(id: animal_ids).order(:id).pluck(:name)
# SELECT “animals”.”name” FROM “animals” WHERE “animals”.”id” IN ($1, $2, $3) ORDER BY “animals”.”id” ASC
# => [“taro”,

元記事を表示

【Ruby, Ruby on Rails】Active Storageで1つの投稿に複数の画像をアップする

## 初めに
プログラミングスクールでは、Active Storageを使って1つの投稿に1枚の写真を保存する方法を学びました。今回、ポートフォリオ制作時に複数枚保存できるといいな、と思って色々調べて実装したのでここにまとめておきます。

## 完成形
– 新規投稿ボタンを押下すると、フォイル選択のフォルダが出てくる。
– Shitキーを押しながら複数枚画像を選択し、アップロードボタンを押下すると、複数枚の画像が投稿フォームに反映される。
– 投稿ボタンを押下すると、上記で詮索した画像とともに投稿される。

## 実装
それでは、実装していきます!
(画像の単数枚投稿が既に頭に入っているという前提で実装方法を説明していきます)

### 下準備(チェックリスト)
##### ✅ 以下のgemをbundle install してますか?
“`ruby
gem “image_processing”, “>= 1.2”
“`
##### ✅ 投稿を保存するモデル、テーブル、カラムを作っていますか?
※モデル、テーブル、カラムを作成するときに、画像を保存するためのカラムは必要ありません。

元記事を表示

【Rails】好きなログファイルを作って出力

# 環境
– Ruby 2.7.6
– Rails 5.2.8

# コード
“`ruby
@log = Logger.new(‘log/check_site.log’)

msg = “AAAAAAAAAAAAA”

@log.info(msg)
“`

# まとめ
設定ファイル触るとかありますけど、その場その場でちょっと違うログファイルに出力したかったりするので、この方法が良いと思います。

カンタン便利。

ログレベルをdebugやらinfoやらあるのは、他記事を参考にして下さい。

これとか↓
https://qiita.com/sobameshi0901/items/b963e7046e2ae8b8e813

終わり

元記事を表示

Ruby でも Python の if __name__ == ‘__main__’ がやりたい

# やりたいこと

– Ruby ファイルを ruby コマンドや bin/rails runner コマンドなどで直接実行した場合のみ、特定のコードを実行したい。
– 別の Ruby ファイルから require した場合は実行したくない。
– Python ファイルでよく見る以下の記述のようなことがやりたい。

“`py
def hello_world():
print(‘Hello World ?’)

if __name__ == ‘__main__’:
hello_world()
“`

# 方法

“`rb
if __FILE__ == $PROGRAM_NAME
end
“`

を使う。

# 例

“`shell
$ ruby body_mass_index.rb
“`

のように Ruby ファイルを直接実行した場合だけ単体テストを実行したい。

“`body_mass_index.rb
require ‘delegate’

class BodyMassIndex < DelegateClass(Float) def i

元記事を表示

Ruby on Rails herokuへのデプロイでのエラー

こんにちは、文系大学生のプログラミング初心者です。
今回、Ruby on railsのチュートリアルを行なっている時に、予期せぬエラーが出たので、エラーの解決方法についてまとめてみました。

具体的にエラーが出たのは、herokuにデプロイを行う時です。
エラーの内容を辿ってみると、、
まずは、
~~~ruby:terminal
remote: !
remote: ! Precompiling assets failed.
remote: !
~~~

こちらを発見、そしてさらに辿ってみると、

~~~ruby:terminal
remote: —–> Installing node-v16.13.1-linux-x64
remote: —–> Installing yarn-v1.22.17
remote: —–> Detecting rake tasks
remote: —–> Preparing app for Rails asset pipeline
remote: Rails couldn’t infer whether

元記事を表示

Rubyのデバッグを楽にする

### はじめに
プログラムをデバッグするときはデバッガーを使ったり二分探索でコメントアウトしてみたり、ログを出してみたりすると思います。
私はログを出してデバッグするのをよくやるのですが、ただ単に

“`ruby
p “value => #{value}”
“`
とか
“`ruby
p value
“`

とかでデバッグしようとしたとき、小さいスクリプトならそれでも問題ないですが、大きいプログラムでやると他にもたくさんログが出ていて出力したものを見失いますよね。

なので自分はよく以下のように書いていました。
“`ruby
# こんなのとか
p ‘++++++++++++++’
p ‘value’
P ‘++++++++++++++’
# こんな感じ
p ‘— (~_~) —‘
p ‘value’
p ‘— (~_~) —‘
“`

他の箇所が絶対に出さないようなものを出していました。顔文字は結構おすすめです。デバッグ中のすさんだ心がかわいい顔文字で癒される。
でもこれ毎回毎回やるのは面倒だなと思いました。
最近業務でフロントエンドをよくやっていたのもあっ

元記事を表示

ざっくりわかる Sprocketsとは

# 何を実現してくれるか

sprocketsはapp/assets 配下にある jsファイルとcssファイルをそれぞれ 1 つのファイルにまとめる。JavaScript と CSS をまとめる理由は、Rails アプリケーションにブラウザでアクセスした時にサーバへのアクセス回数を減らすため。

# 関連する用語

### アセットパイプライン

Sprocketsがcssファイルとjavascriptファイルをまとめるまでの工程はアセットパイプラインと呼ばれている。

### コンパイル

特定のプログラミング言語を用いて記述されたコンピュータープログラムを他の言語 を用いて記述された同じプログラムに形を変えることである。Sprocketsではアセットパイプラインの処理を実行することをコンパイルという。

### ディレクティブ

ディレクティブとはSprocketsで外部ファイルを読み込むための記述のことである。
ここでいう外部ファイルとはjsの場合`app/assets/javascripts`配下、cssの場合`app/assets/stylesheets`配下にあるファイルの

元記事を表示

Tips: RubyでURLのクエリパラメータをいい感じに書き換える

## これは何
– RubyでURLのクエリパラメータを書き換える方法がちゃんとまとまっているところがなかったので、まとめたものです
– 実装するので、よかったら使ってください

## RubyでURLのクエリパラメータを書き換える時の問題点
RubyでURLのクエリパラメータを書き換える場合、`URI`モジュールを使うことが多いのではないでしょうか。

“`rb:例
uri = URI(‘https://example.com’)
uri.query = ‘a=1’
uri.to_s #=> “https://example.com?a=1”
“`

しかし、これだと以下のような問題が発生します。

### クエリパラメータがすでに付与されている場合、上書きをしてしまう
クエリパラメータが初めから付与されている場合、このような実装だと上書きをしてしまい、情報が欠損してしまいます。

“`rb:例
uri = URI(‘https://example.com?b=1’)
uri.query = ‘a=1’
uri.to_s #=> “https://example.com?a=1

元記事を表示

100日後くらいに個人開発するぞ!day065

## 今日はRuby on Railsの基礎を学んでみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/91d54fa3-a858-5378-699a-45ea83e14227.png)

## 今日の学び
### Railsアプリケーションの準備
* Railsで開発を始めるには`rails new アプリケーション名`というコマンドをターミナルで実行する
* 入力したアプリケーション名と同名のフォルダが作成され、その中に開発に必要なフォルダやファイルが用意される

### サーバーの立ち上げ
* 開発中のアプリケーションをブラウザで表示するにはサーバーの起動が必要
* サーバーの起動は`rails server`というコマンドの実行で完了する
* サーバー起動後にブラウザで`locaolhost:3000`というURLにアクセスすると色画面が表示されるようになる

### トップページを自動生成してみる
* トップページを作成するには`rails gen

元記事を表示

Rails RspecのテストをShoulda Matchersで簡単に書く

# はじめに
現場ではRspecを使用してテストコードを書いています。
modelのテストを行うにあたって先輩に要件を確認していたところ、「Shoulda Matchersを使うと簡単だよ。」と教えてもらいました。
そもそもこれなんて読むんだ?そして何が美味しいんだ?
と思いながら調べてみましたので備忘録として残します。
誤り、おかしな点はぜひご指摘いただければと思います。
# 環境(私のPC)
Ruby 2.7.1
Rails 6.0.5

# Shoulda Matchersとは
Shoulda Matchersとは長くて複雑かつつまずきやすいテストコードをワンライナーで記述することができるgemです。ワンライナーなので一行ということです。
え?そんなことができるの?ありえないでしょう。
半信半疑の思いを払拭すべく実際にやってみることにします。
(補足)
調べてみると「シュルダ マッチャーズ」と読むみたいですね。
スウェーデン語のようで日本語に訳すと「一致すべきです」となります。
# 前提条件
※すでにRspecがインストールされているものとします。
### モデルの準備
次のよ

元記事を表示

【Ruby on Rails】gsubで特定の文字列を挟んでhtmlタグを表示させる方法

## 僕がやろうとしていたこと
実務である特定の文字列が存在した場合に、その文字の色を赤くして表示ということをしたくなった。

その時に使用したので gsubというインスタンスメソッドで実現可能ということを知った。
このgsubを使用して、特定の文字が存在した場合にその文字を“タグを使って囲みstyleを適用する“ことによって実現することができた。

## どうやったか(コード例)

“` ruby
gorira = “僕は大人になったらゴリラになりたい”
gorira.gsub(/ゴリラ/, ‘\&‘)
# => “僕は大人になったらゴリラになりたい”
“`
こんな感じでやりたいことは一応実現することができた。

元記事を表示

AWS SDK Rubyでスタブを行う

## はじめに
AWS SDKを使用したコードに対してテストを記述したい場合、AWSのSDKで用意されているClientStubsを使用して、スタブを行うことが可能です。
ドキュメント自体は公式が出しているものがありますが、この例だけではやりたいこと(`Aws::S3::Client`以外のインスタンスを使うケース)が実現できなかったので、今回調べたことについてまとめました。

## 環境
– Ruby: 2.7.1
– aws-sdk: 3.1.0
– aws-s3-sdk: 1.114.0

## 公式ドキュメントから
https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/ClientStubs.html

このドキュメントにあるように`Aws::ClientStubs`というモジュールが、各サービスに対応したClientクラスにincludeされています。

今回はS3を使って、その例を紹介します。

このモジュールに定義されているのは`api_requests`, `stub_data`,`stub_respo

元記事を表示

has_oneで追加される関連メソッド

## はじめに
ポートフォリオ作成中、has_one(1対1)の関連付けが必要になりました。
公式ドキュメントなど読んで、「これは頻繁に使いそうだな」と思ったメソッドを紹介します。

## サンプルモデル
ユーザー(User)がプロフィール(Profile)を作成できると考えます。

“`rb:app/models/user.rb
class User < ApplicationRecord has_one :profile end ``` ```rb:app/models/profile.rb class Profile < ApplicationRecord belongs_to :user end ``` ## 関連メソッド ```rb #関連付けされたオブジェクトを返す @user.profile #関連付けされた新しいオブジェクトを返す @user.build_profile(self_introduction: "I am a beginner") #関連付けされたオブジェクトを作成する @user.create_profile(self_introdu

元記事を表示

OTHERカテゴリの最新記事