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

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

▸ Error: docker build exited with Error: 1 & executor failed running [/bin/sh…] : exit code: 100 の対処法

だれでもエンジニア / 山浦清透 さんの[Docker超入門講座 合併版 | ゼロから実践する4時間のフルコース](https://www.youtube.com/watch?v=lZD1MIHwMBY)を拝見している時に、

“`:Command
Error: docker build exited with Error: 1
“`
とエラーが出てしまいました。。

#検証 1

https://qiita.com/akira-i/items/54462f5bd7fca868a818

を参考にしてVersionを変更してみましたが、エラーは解消されず。
https://gyazo.com/36e0631b46d5efc80180f35bcc338abc
ubutuの時は、バージョン変更でいけるらしいが、Rubyはどうやら違うぽい。

#検証2
Errorコードをよく見てみると

“`
ERROR [2/7] RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add – && echo “de

元記事を表示

Railsのid列は必ずしもきれいな連番にはならないんですよ、という話

## はじめに
Railsでモデルを作ると、テーブル定義上のid列(プライマリーキー)はデフォルトで自動的に連番が付与されるカラム(auto increment値)になります。

とはいえ、idにしたからといって必ずしも連番になるとは限りません。場合によっては「歯抜け(ギャップ)」が発生こともあります。
そのため、「idの最大値=そのテーブルの件数」になるとは限りません。

つまり、こういうデータが作成されることもありうる、ということです(たとえ一度もDELETEされなかったとしても)。

| id | name |
|—-|——-|
| 1 | Alice |
| 2 | Bob |
| 5 | Carol |

そこでこの記事ではRDBMS別にidの連番が歯抜けになるケースを見ていきます。

## この記事で使用するサンプルアプリ
この記事で使用するのは以下のようなモデルを1つだけ持つ、単純なRailsアプリです。

“`ruby
class Item < ApplicationRecord end ``` ```ruby:db/schema.rb A

元記事を表示

アプリを作る アカウントを有効化する

###app/models/user.rb
“`app/models/user.rb
class User < ApplicationRecord # 継承させる attr_accessor :remember_token, :activation_token before_save :downcase_email before_create :create_activation_digest validates :name, presence: true, length: { maximum: 50 } VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i validates :email, presence: true, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: fals

元記事を表示

rubyで複数行の文字列を表現する方法(ヒアドキュメント)

# 概要
この記事ではRubyで複数行の文字列を表現するためのSyntaxをざっくり解説したいと思います。

## 謝辞
* 株式会社X-HACKさんで[PARKLoT](https://www.park-lot.com/)というTwitterインスタントウィンサービスのバックエンド開発をお手伝いさせていただいております。本記事ではその経験で得られた知識をアウトプットしています。ありがとうございます。
* 参考にさせていただいた記事は以下の通りです。ありがとうございます。
* [(Qiita) rubyで複数行の文字列](https://qiita.com/nomuyoshi/items/819942f06cc4c7fd8a26)
* [ヒアドキュメントを使って複数行を 1 つの文字列にする方法](https://bayashita.com/p/entry/show/189)

## 書き方

“`ruby
str = <<"EOS" hello world EOS # => 変数strに改行された文字列”hello\nworld\n”が代入される
# 上記

元記事を表示

【Ruby】dynamic constant assignmentというエラー

#状況
ページタイトルをapplication helperを使って動的に表示するために、以下のコードを書いた。

“`ruby:application_helper.rb
def full_title(page_title)
BASE_TITLE = “title”
BASE_TITLE.freeze
if page_title.empty?
BASE_TITLE
else
page_title + ” – ” + BASE_TITLE
end
end
“`
ここで、BASEE_TITLEは定数であるため、UPPER_CAMEL_CASEで定義している。
またrubyにおける定数は再定義ができるソフトな(破壊的変更が可能な)代物なので、再定義ができないようにfreezeメソッドを使って凍結しておいた。

実行した結果、
syntax errorとして以下のエラーが表示された

“`
dynamic constant assignment
BASE_TITLE = “title”
^~~~~~~~~~
“`
#対処法
メソッドの外で定数を定義

元記事を表示

ruby配列作成時のコードが理解できなかったので、調べてみた。

##はじめに
railsのテストについて学習している時、何気なく出てきたコードが読めなかったので、備忘録として記録します。

以下の記事について学習していました。
[使えるRSpec入門・その2「使用頻度の高いマッチャを使いこなす」](https://qiita.com/jnchito/items/2e79a1abe7cd8214caa5)
何気なく出てきた、確率を求めるrubyのコードとそのテストコードの内容が初見で理解できなかったので、そのことについてです。

##問題のコード

~~~ruby:lottery.rb
class Lottery
KUJI = %w(あたり はずれ はずれ はずれ)
def initialize
@result = KUJI.sample
end
def win?
@result == ‘あたり’
end
def self.generate_results(count)
Array.new(count){ self.new }
end
end
~~~
~~~ruby:spec/lottery_spe

元記事を表示

[py2rb] 部分適用

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# partial (Python)
“`python
from functools import partial

def partial_func(name, value):
print(name, value)

func1 = partial(partial_func, ‘aa’)

func1(‘bb’)

# aa bb
“`
https://docs.python.org/ja/3.7/library/functools.html#functools.partial

https://qiita.com/sporty/items/4c7af5dd6a457dff3a57

ふむふむ。
# どうすRuby
“`ruby:lambda.rb
func2 = lambda do |name|
partial_func = lambda do |value|
puts “#{name} #{value}”
end
end

func1 = func2.ca

元記事を表示

RSpecでit / example / specifyはどのように使い分けるのか?〜日本語で書くならexampleって本当?〜

## はじめに

最近ときどき「RSpecで`it`/`example`/`specify`をどのように使い分けたら良いのか」という話題を見かけるので個人的な私見を書いてみます。

## 使い分けに何か決まりはあるのか? → 技術上の決まりは何もありません

`it`/`example`/`specify`は技術的にはまったく同じメソッドです。なので、`it`を`example`や`specify`に置き換えても問題なく動きます。

“`ruby
# itを使う
it ‘adds numbers’ do
expect(1 + 1).to eq 2
end

# itの代わりにexampleを使う
example ‘adds numbers’ do
expect(1 + 1).to eq 2
end

# itの代わりにspecifyを使う
specify ‘adds numbers’ do
expect(1 + 1).to eq 2
end
“`

日本語と英語で使い分けが必要、なんてこともありません。

“`ruby
# itを使う
it ‘数値を加算する

元記事を表示

rubyでの改行

rubyで、\nのようにして改行する方法は知っていたのですが、ほかにも改行するやり方があったので、それを紹介しようとおもいます。

##+を使った際の改行
“`
p (2+
1)
=> 3

p (2\
+1)
=> 3

p(2
.+1)
=> 3
“`

##文字列とシンボル、そして数値を改行する

“`
p “ho\
ge”
=> “hoge”

#\の直後にスペースが入っている
p “hoge\
ge”
=> “hoge \nge”

p :”ho\
ge”
=> “hoge”

p 10\
1
=>SyntaxError
“`

##ピリオドによる改行

“`
p 3.
to_s
=> “3”

p 3
.to_s
=> “3”
“`
ピリオドの場合は、ピリオドが改行前にあるか、改行後にあるかは関係ないんですね。

##メソッドを使うときの改行

“`
def hoge(a);
p “hoge:#{a}”
end

hoge(1)
=> “hoge:1”

hoge(
1)
=> “hoge:1”

hoge\
(1)
=> “hoge

元記事を表示

たった10行で簡単に絞込みセレクトボックス(Javascript無し)

# 親子セレクトボックス

1番目のセレクトボックス(ドロップダウンリスト)で選択すると、2番目のセレクトボックスで選択肢が絞り込まれる、あれです。(正式にはなんというのかわかりませんでした。ドリルダウン?)(とりあえず、1番目を親セレクタ、2番目を子セレクタと呼びます)

例としては、親セレクタで都道府県名を選択すると、その都道府県内の市町村に子セレクタの選択肢が絞り込まれるというありがちなパターンです。

その親子セレクタが、Rails 7 で採用された [Hotwire](https://hotwired.dev/) ([Turbo](https://turbo.hotwired.dev/)) であれば、**ものすごく簡単**に実装できます。トータルで10行くらいです。Javascript は使いません(HTMLとJavascriptの知識は必要。)
環境を Rails 7.0.1 と Ruby 3.1 として、例を作成しながら説明します。

![window.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.c

元記事を表示

【Rails】where.notを連結するしないでクエリが異なる

下2つは同じクエリを吐き出すと勘違いしていたので備忘録。

“`ruby
where.not(tag: ”, user_id: 1)

where.not(tag: ”).where.not(user_id: 1)
“`

##where.notを複数連結

画像左

“`ruby
Post.where.not(tag: “Ruby”).where.not(user_id: 1)
=> SELECT `posts`.* FROM `posts` WHERE `posts`.`tag` != ‘Ruby’ AND `posts`.`user_id` != 1
“`

##連結しない
画像右

“`ruby
Post.where.not(tag: “Ruby”, user_id: 1)
=> SELECT `posts`.* FROM `posts` WHERE NOT (`posts`.`tag` = ‘Ruby’ AND `posts`.`user_id` = 1)
“`

![math.jpeg](https://qiita-image-store.s3.ap-n

元記事を表示

Railsチュートリアル7章、本番環境へデプロイ出来ない原因なんてこんなもんよ

https://wa3.i-3-i.info/word16767.html

デプロイとは使える状態にする。ということである。
わわわ事典より。

一向に使える状態になりません。困りましたねぇ。

“`$ push heroku“`

アプリにアクセス…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2144713/0a83c1fb-53cf-b2b9-7e32-c5470f9eda83.png)

wtf!
“`$ rails test“`
0 failures, 0 errors, 0 skips

問題ないですね。
原因が絞られてきました。

まず、こちらを参考に

https://qiita.com/kents1002/items/e1b90c71897c55b8e870

うんうん同じ画面です。
“`$ heroku logs –tail“`(リアルタイムのログを追跡して確認)

“`$ heroku restart“`
うーん
sqlite3は関係ないし

元記事を表示

Ruby on Rails チュートリアル第3章をやってみて

#ほぼ静的なページの作成

■第3章
この章から本格的なサンプルアプリケーションの開発を始めるそう。以降の章で色んな機能を足していく(マイクロポスト、ログイン/ログアウト等)。つまりこの章がちゃんとできないと終わりってことか…

##3.1 セットアップ

2章と同様に、新しいRailsプロジェクトの作成から

“`
$ cd ~/environment
$ rails _5.1.6_ new sample_app
$ cd sample_app/
“`

またGemfileの中身を置き換え、ここら辺は慣れてきましたね。
前の2つの章と同様にbundle installを実行して、Gemfileで指定したgemのインストールをする。

以下のコマンドで、roduction環境でしか使わないgemはインストールしないようにしておく。

“`
bundle install –without production
“`

このコマンドを実行することで、インストールなしでSQLiteが使えるようになるらしい。

ここまできたら、Gitリポジトリの初期化を行う。

“`
$ g

元記事を表示

flattenメソッドについて

##flattenメソッド
flattenという英単語は、均す(ならす)という意味です。
flattenメソッドとは、多次元配列を1次元配列に変えるメソッドなんです。
実際にコードを見ていきましょう

“`
arr = [1, 2, 3, [6,8], 9]
arr.flatten
=> [1, 2, 3, 6, 8, 9]
“`
上記の例をみると、多次元配列が、1次元配列になっています。

このメソッドは配列だけでなく、ハッシュでも使われます。ハッシュで使われると、1次元配列にしてくれます。
実際にコードを見ていきましょう

“`
hash = { ‘hoge’: 100, ‘fuga’: 200 }
hash.flatten
=> [:hoge, 100, :fuga, 200]
“`
このようにハッシュでも1次元配列にしてくれるメソッドなんですね。

多次元配列じゃない配列に破壊的メソッドであるflatten!を適用すると、nilが返ってくるんです。

“`
[‘hoge’,’fuga’,’hogehoge’,’fugafuga’].flatten!
=> nil
`

元記事を表示

Rubyの自己代入(||=)について

実務をこなしていく中で、自己代入を使ったコードをよく見るので、それを解説していきます。

例えばこんなコードです。

“`
a = ‘hoge’
b ||= ‘fuga’
b
=> “fuga”
“`
このコードでは自己代入が使われています。この自己代入とは
**左辺の変数が、nilもしくはfalseのとき||=の右辺にある値を代入する**という意味です。
上記のコードでいえば、変数bがnilもしくはfalseのときfugaという文字列を変数bに入れてくださいね、という意味になります。
変数bはそれに当てはまるので、bにはfugaという文字列が入ります。

下記のようなコードを書いて見ましょう

“`
a = ‘hoge’
a ||= ‘fuga’
a
=> “hoge”
“`
上記のコードでは、aはfalseでもnilでもないのでfugaはaに代入されません。

“`
a ||= 10
“`
上記のコードは、

“`
a = a || 10
“`
このように論理演算子で考えると分かりやすいとおもいます。論理演算子の理解があやふやな方は、[こちら](https://qi

元記事を表示

public_sendとsendの違い

実務をしていく中で、public_sendとsendというメソッドが出てきたので、詳しく調べたので、記事にしようとおもいます。

結論からいうと、privateメソッドを呼び出せるか否かの違いなんです。
詳しく解説していきます

##privateメソッドとは
privateメソッドと普通のメソッド(クラスメソッドやインスタンスメソッド)の違いは、他のクラスで使えるかどうです。
実際に具体例を見ていきましょう

“`
class Test
def public_method
puts ‘publicメソッドだよーん’
end

private

def private_method
puts ‘privateメソッドだよーん’
end
end

class Test2
def public_method2
puts ‘これもpublicメソッドだよーん’
end

test = Test.new
test.public_method
=> publicメソッドだよーん

 test.private_method
 =>

元記事を表示

Ruby Threadについて

##Threadとは?

メインのプログラムを読み込む作業と並列して実行されるrubyのプログラムのことです。
実行したいプログラムを分担するようなイメージですね。

その並行して実行させているプログラミングのことを並行プログラミングといいます。

##Threadの種類と、それの作り方
Threadには、プログラムが開始されたときに実行されるmainThreadや、現在実行されているcurrentThreadなどがあります。

実際にそのコードを打ってみましょう

“`
p Thread.main
=> #

p Thread.current
=> #
“`
自分の実行環境では、スレッドを作ってないため参考にならないかもしれませんが、違う数字が返ってくることもあります。

では、実際にあらたなスレッドを作ってみましょう。
スレッドの作り方はnew, start, forkを使って、その後ろにブロックをつけてあげることで生成することができます。

“`
Th

元記事を表示

【Ruby】クラスの継承とモジュールのmixinについて

# はじめに
クラスの継承とモジュールのmixinについてまとめてみました。

# クラスの継承
飲み物の種類を管理するシステムがあるとします。
お酒には「名前」「価格」「アルコール度数」という属性を、コーヒーには「名前」「価格」「サイズ」という属性を持たせます。
しかし、お酒とコーヒーでは「名前」「価格」という属性が共通しています。

“`ruby
class Osake
def initialize(name, price, alcohol)
@name = name
@price = price
@alcohol = alcohol
end
end
osake = Osake.new(‘beer’, 350, ‘5%’)
osake.name #=> beer

class Coffee
def initialize(name, price, size)
@name = name
@price = price
@size = size
end
end
coffee = Coffee.new(‘hot_coffee’

元記事を表示

sortメソッドと<=>の解説

##sortメソッド
sortとは、日本語で「並び替える」という意味です。つまり、sortメソッドとは、ある一定の基準で並び替えるメソッドです。
実際に具体例を見てみましょう

“`
ary = [4, 2, 9, 8, 3, 16, 10]
p ary.sort
=> [2, 3, 4, 8, 9, 10, 16]
“`
sortメソッドは、デフォルトで昇順に並び替えるメソッドです。上記の例では、配列の中身が昇順で並び変わっています。

降順で並び替えるには、2つの方法があります。
➀reverseメソッドを使う
➁<=>演算子を使う
順に説明していきましょう

##➀reverseメソッド
reverseとは「反転する」という意味です。つまり、reverseメソッドは、配列やハッシュなどの値を反転させるメソッドなんです。
実際にコードを書いてみると以下のようになります。

“`
ary = [4, 2, 9, 8, 3, 16, 10]
p ary.sort.reverse
=> [16, 10, 9, 8, 4, 3, 2]
“`
このように書けます。個人的にはメソッドを

元記事を表示

Ruby Hanamiでguard-rspecを使うときのGuardfileの参考例

これで良さそう

“`ruby
directories(%w[apps lib config spec].select { |d| Dir.exist?(d) ? d : UI.warning(“Directory #{d} does not exist”) })

guard :rspec, cmd: ‘bundle exec rspec -c -fd’ do
require ‘guard/rspec/dsl’
dsl = Guard::RSpec::Dsl.new(self)

# RSpec files
rspec = dsl.rspec
watch(rspec.spec_helper) { rspec.spec_dir }
watch(rspec.spec_support) { rspec.spec_dir }
watch(rspec.spec_files)

# Hanami files
watch(%r{^lib/(.+)\.rb$}) { |m| “spec/#{m[1]}_spec.rb” }
watch(%r{^apps/

元記事を表示

OTHERカテゴリの最新記事