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

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

Ruby if, else問題

# if, elseを使ってプログラムを作成します

条件は以下の通りです。
– 条件1:メソッドの実引数として「1以上の正の整数」を3つ用意し、それぞれを仮引数a,b,c としてnumメソッド内で使用する
– 条件2:第一引数と第二引数は足し算をし、変数abに代入する
– 条件3:第三引数が3以下の場合は変数abを第三引数の値で割り、結果を出力する
– 条件4:第三引数が4以上の場合は変数abを第三引数の値で掛け、結果を出力する
※小数点以下の出力は考慮しなくてかまいません。

模範解答
“`ruby
def num(a, b, c)
ab = a + b
if c <= 3 puts ab / c else puts ab * c end end # 呼び出し例 num(1,5,3) ``` ```:ターミナル 2 # ab = 1 + 5 = 6 # 6 / 3 = 2 ``` ## 解説 条件2に、第一引数aと第二引数bを足したものを変数abに代入するとあるので、その式を2行目に記述します。 if文には第三引数cが3以下の

元記事を表示

[PracticeA][Welcome to AtCoder]を解いてみた!RubyでAtCoderの解説

# 正解したコードの解答例
“`
a = gets.to_i
b,c = gets.split(” “).map(&:to_i)
s = gets.chomp

puts (“#{a+b+c} #{s}”)

“`
# 解説
1行目a = gets.to_i
のgetsメソッドでは、ユーザーがキーボードで入力した値を文字列として取得しています。
問題文は数値での出力が求められるためto_iメソッドで数値化してあげます。

2行目b,c = gets.split(” “).map(&:to_i)
b,cで入力したコードをsplitメソッドで指定した区切り文字(” “)で分割し、配列で返します。
b cの入力時にスペースをあけるため、ここでsplit(” “)が作用して文字列の配列が作成されます。
このままでは配列の中身は文字列の状態なので.map(&:to_i)を使用して配列の中身を全て数値オブジェクトに変換します。

3行目のchompは改行をなくすメソッドです。getsのみだと改行が入るようになっています。

最後、計算結果を出力しています。

以上、PracticeAの解説でし

元記事を表示

【Rails】3種類のラベルのうち1つは必ず選択(バリデーション)

## はじめに
現在webアプリ制作に携わらせていただいている中で調べて学んだことをアウトプットしていきたいと思います。
よろしくお願いいたします。

## 開発環境
Rails 6.0.3
Ruby 3.0.1

## 参考記事
[Active Record バリデーション](https://railsguides.jp/active_record_validations.html)
[Railsで特定の条件下で走るバリデーションを作りたい](https://qiita.com/tmzkysk/items/a0c874715ba38eb23350)

## どうしたいか
新規質問投稿時に、3種類のタグから当てはまるタグを複数選択できるようになっているが、`「投稿時にタグを1つは必ず選択させる」`ようなバリデーションを構築したい。

## ER図
questionsテーブルにlabelsテーブル、categoriesテーブル 、kindsテーブルがそれぞれ多対多の関係で紐づいています。
![Qiita.png](https://qiita-image-store.s3.ap-nort

元記事を表示

外部キー制約ついているデータの削除

# 外部キー制約がついているデータの削除について

外部キー制約がついているデータを削除するために必要なことを簡単にまとめました。
外部キー制約がなければ、destroyアクションで削除機能を実装する事ができますが、外部キー制約があると削除を実行するとエラーが出てしまします。

## エラーが出た時のコード
“`Ruby:app> models> user.rb
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable with_options presence: true do validates :name

元記事を表示

【TechCamp】受講を終えてからの感想や

# はじめに
– 本記事は、個人の感想や定量的でない内容が含まれたりします。
– また記載内容はすべて、正しい内容が記載されているとは限りません。
– 誤った内容を見つけた場合は、ご指摘をお願いいたします。

# この記事は誰向けの記事か?
– プログラミングスクールの受講を考えている人
– TechCampを受講している人
– TechCampを受講し終えた人

# 私自身について
私は30歳の元ITエンジニア(2023年2月時点)です。以前の職場では、製造業向けのアプリケーション開発現場で約2年、製造メーカーの社内SEとして約2年勤めていました。そのため未経験というわけではなく、経験者という立ち位置で参加させていただきました。元々は仕事と並行しつつ、Webアプリケーションの開発経験を積めるスクールに通いたいなと考えていたのですが、脳の疾患に罹患し、仕事をリタイアしてしまいました。完治するかは未定ですが、今後もITエンジニアとして仕事をしていきたい、という思いもあり、TechCampへ参加することにしました。

# 受講プラン
私が受講したプランの情報は以下のとおりです。
– 短期集

元記事を表示

Railsで新規アプリケーションを作成

## はじめに
アプリケーションを新規作成する時の最初の手順を備忘録として記録しておきます。
## ターミナルで新規作成
**【ターミナル】**
“`terminal
% rails _(railsのバージョン)_ new (アプリケーション名) -d mysql
“`
## 文字コードの変更
必要があれば、文字コードを変更しておきます。

**【config/database.yml】**
“`diff_ruby
default: &default
(省略)
– encoding: utf8mb4
+ encoding: utf8
(省略)
“`
※文字コードを変更するのは何故か?
utf8:1〜3バイトまで対応
utf8mb4:1〜4バイトまで対応
文字化けを起こす可能性があるので、変更する必要がある場合が存在します。

## データベースの作成
ターミナルにて、データベースの作成を行います。

**【ターミナル】**
“`terminal
% rails db:create
“`

## ローカルホストで挙動確認
最後に、ローカルホストで、新規作成した

元記事を表示

MacでRuby3.2.1 インストールメモ

# 変更履歴
2023/2/15 初稿(とりあえず殴り書き)

# 環境
H/W : Macbook Air 13inch (model A1932、メモリ16GB)
OS : macOS Ventura 13.2

# はじめに
ヤフオクでMacbook Airを手に入れたので最新版のRuby3.2.1を入れようとしたら無茶苦茶めんどかったのでメモを残します。
最終的にうまく行ったコマンドの羅列となります。
誰かの参考になればいいなぁ。

# インストール準備

## Homebrew
ここを見るような人はとっくに入っていると思いますが、私のようなMac初心者もいると思いますので。
以下よりインストールしてください。
[Homebrew]

バージョンを確認。
“`
% brew –version
Homebrew 3.6.21-91-g31ec835
Homebrew/homebrew-core (git revision 31ec835c9; last commit 2023-02-13)
Homebrew/

元記事を表示

Ruby sliceメソッド

# sliceメソッド
配列や文字列から、指定した要素を取り出すことができるメソッドです。

“`ruby:例
# 配列を作成します
array = [0,1,2,3,4,5,6]

# 配列から引数で指定した要素を取得します
ele1 = array.slice(1)
puts ele1
#=> 1 # 0番目から始まるため、1が取り出されました

# 配列番号-4から4つ分の要素をsliceします
ele2 = array.slice(-4,4)
puts ele2
#=> 3, 4, 5, 6

# 配列はもとのままです
puts array
#=> [0,1,2,3,4,5,6]
“`

# sliceメソッドを使って指定した文字列を取り出すプログラムを作成します

条件は以下です。
– 条件1:対象の文字列から末尾にある2文字を取得すること
– 条件2:取得した2文字を3回繰り返して出力すること

“`ruby:模範解答
def extra_end(str)
right2 = str.slice(- 2, 2)
puts right2 * 3
end

#

元記事を表示

【Ruby on Rails】validationの冗長をなくす方法

# 前提条件
– Ruby 3.1.0
– Rails 7.0.4

# 背景
全てのカラムに対して同じバリデーションを設定すると、下記のように同じ記述が繰り返され冗長性がある状態である。
“` ruby:User.rb
class User < ActiveRecord::Base validates :name, presence: true #冗長性あり validates :email, presence: true #冗長性あり validates :age, presence: true #冗長性あり validates :password, presence: true #冗長性あり end ``` # やりたいこと バリデーションの冗長性をなくしたい。 # 方法 ### with_optionsブロックを使う 下記のようにwith_optionsブロックでpresenceをまとめることで、ブロック内のカラムすべてに適用されるようになる。 ``` ruby:User.rb class User < Active

元記事を表示

デバックの考え方

◎デバッグとは
意味:バグを無くす
デバックは、プログラミングに問題があった時にそれを解決すること。

○初心者にとって特に重要!!→なぜ重要なのか?
・自走力を身につけるため
  プログラマーとして仕事をするには、自分で問題を解決するのが重要
・学習効率を向上させる
  一般的なデバッグの知識は付け焼き刃の知識ではない。
 すべてのプログラミングの学習に通じる考え方なので応用が効く。

○どうやってやるのか?
 STEP1
  証拠集め(情報収集)
 STEP2
  証拠を解釈(情報の意味を把握)
 STEP3
  犯人を推理(原因を推測)

・具体的に
 STEP1
  証拠集め(情報収集)
  ・エラーが、出ている確認! 一番大事
  エラーは、最大のヒントです。ダイイングメッセージみたいなもの
  読まないのはもったいない!!

  ・どういう場合に動かなくなるのか?
  何をした時に動かなくなるのか?

  どこまで動いている?
  ブレークポイントなどを使いどこまで確実に動いているのか確認する

※もし証拠がない場合でも、証

元記事を表示

?【Ruby入門】ファイル読み込みから採点する簡易機能実装

Rubyを使って、ファイル(txt)を読み込んで、採点できるような簡易機能を実装してみました。:writing_hand:

## 前提
– ファイル構成
– scoring.rb
– test.txt(問題の回答を改行して記載したとする)
– 考慮していない点(簡易版なので。。:angel_tone2:)
– ファイルの存在チェック
– 回答が不十分の場合(回答が3つ未満、4つ以上の場合)
– 全問正解しか判断できない、不正解があった時に何個不正解なのか、何個正解なのか分からない
– エラーハンドリング
– etc..

## ファイル
“`ruby:scoring.rb
answer_arrays = [‘1’, ‘2’, ‘3’] # 答えを配列で管理する
index = 0
is_incorrect_answer = false # 不正解があった場合 true にする

filename = ARGV[0] # コマンドラインからデータを入力する ex. ruby scoring.rb test.txt
file = File.open(file

元記事を表示

?【Ruby入門】Arrayを使っておみくじを実装してみる

[class Array(Ruby 3.0)](https://docs.ruby-lang.org/ja/3.0/class/Array.html)を用いておみくじを作ってみよう。:pencil2:

“`ruby:sample.rb
omikuzi_array = [‘大吉’, ‘吉’, ‘中吉’, ‘小吉’, ‘末吉’, ‘凶’, ‘大凶’]

p omikuzi_array.sample
# => “大吉”
p omikuzi_array.sample
# => “小吉”
“`

## 解説
– Arrayの[sampleメソッド(Ruby 3.0)](https://docs.ruby-lang.org/ja/3.0/class/Array.html#I_SAMPLE)を使用しました。
– ランダムに要素を取得してくれる。([Kernel.#srand(Ruby 3.0)](https://docs.ruby-lang.org/ja/3.0/class/Kernel.html#M_SRAND)が有効)
– `Arrayの#sample(n)`のように要素を指定し

元記事を表示

?【Ruby入門】puts、print、p、ppメソッドの違い

「puts、print、p、pp」は出力用のメソッドで使用されますが、改めて違いに関して整理したいと思います。:pencil2:

## puts
– オブジェクトを出力後に**改行**する。
– [Kernel.#puts(Ruby 3.0)](https://docs.ruby-lang.org/ja/3.0/method/Kernel/m/puts.html)

“`ruby:sample.rb
puts ‘hellow’, ‘world’
# => hellow
# => world
“`

## print
– オブジェクトを出力後に**改行**しない。
– [Kernel.#print(Ruby 3.0)](https://docs.ruby-lang.org/ja/3.0/method/Kernel/m/print.html)

“`ruby:sample.rb
print ‘hellow’, ‘world’
# => hellowworld
“`

## p
– オブジェクトを出力後に**改行**する。
– 引数で渡されたオブジェクトがそのまま戻り値になる。

元記事を表示

Rubyのdigをpythonでやる

## 課題
ネストされたdictから特定の値を取り出したいとき

## Rubyの場合
以下のように、nullチェックをしながらいい感じに取り出してくれる
“`rb
data_a = { ‘name’: { ‘first_name’: ‘yamada’, ‘last_name’: ‘taro’ } }
data_b = { ‘name’: { ‘last_name’: ‘taro’ } }

p data.dig(‘name’, ‘first_name’)
# => yamada

p data.dig(‘name’, ‘first_name’)
# => nil
“`

## Pythonの場合
digのようなメソッドはないので愚直にやると以下のような方法になる。
“`py
data_a = { ‘name’: { ‘first_name’: ‘yamada’, ‘last_name’: ‘taro’ } }
data_b = { ‘name’: { ‘last_name’: ‘taro’ } }

if ‘name’ in data_a and ‘first_name’ in

元記事を表示

Gem fileにてGemを取り込む方法 Gemfile.lockの説明

使用しているVer ruby 2.6.5 Rails 6.0.6.1

○Gemとは?
誰かが作ったものを活用するために、Gemが存在します。
プログラマーでよく言われる言葉で、「車輪の再発明をしない」
この言葉の元Gemというものがありそういったもの総称をライブラリーとも言います。
ライブラリーは有名な言語であれば必ず存在します。

○早速Gemを取り込んでいきたいと思います

まずGem fileにてGemの名前を書き込みます。
 今回はfakerを取り入れます。
 

下記をGem fileに記入

gem ‘faker’
ターミナルにて、

$ bundle install

と実行。※$は記入しません。
以上でfakerのダウンロード完了です?

・READMEのドキュメントに使い方やインストールのやり方が記入されています。
https://github.com/faker-ruby/faker
もし、他にも取り入れたいgemがあれば、READMEを参考に使用するか
全て英語で分かりづらい時は、有名なgemであれば検索して日本語で出てくるかと思

元記事を表示

【Ruby on Rails】ルーティングのネストで発生するActionController::UrlGenerationErrorの解消方法

# 前提条件
– Ruby 3.1.0
– Rails 7.0.4

# エラー事象
ルーティングのネストは正しく記述されているはずなのに、Prefix`new_user_food_path`が利用できない。ActionController::UrlGenerationErrorが発生する。
“` ruby:config/route.rb
resources :users do
resources :microposts
end
“`
“` user/show.html.erb

<%= link_to "新規投稿", new_user_micropost_path %>

“`
# 原因
### new_user_micropost_pathの引数にユーザ情報がなかった
`$ rails routes`でルーティングをよく見ると、
`new_user_micoropost`のURI Patternは`/users/:user_id/~`、
`user`のURI Patternは`/users/:_id/~`

元記事を表示

10の倍数の差が2以内で条件分岐する方法

復習しアウトプットします。

“`ruby:
正の整数を入力し、その整数が、10の倍数(10,20,30…)からの差が2以内であるときはTrueそれ以外はFalseを出力するメソッドを作成
>出力例:
near_ten(12)→True
near_ten(17)→False
near_ten(19)→True
“`

“`ruby:自身の回答
def near_ten(num)
if num_x = num % 10
num_x <= 2 || num_x >= 8
puts “True”
else
puts “False”
end
end
“`
“`ruby:模範解答
def near_ten(num)
quotient = num % 10
if quotient <= 2 || quotient >= 8
puts “True”
else
puts “False”
end
end
“`

惜しい。。。。惜しいい!!!!!
悔しい。笑

# アプトプット解説
“`diff_ruby:
def

元記事を表示

Railsのモデルにscopeを定義する場合の注意点

## はじめに
自分用のメモになります。

## 結論
find_byなどのnilを返すメソッドをscopeに設定しない

## なぜなら
モデルのscopeでnilが返される条件が発生すると、該当のscope検索結果を無視した、クエリを発効してしまう。

Humanモデル

“` ruby:human.rb
class Human < ApplicationRecord enum :gender, { male:0, female: 1} scope :find_gender, -> (gender) { find_by(gender: gender) }
scope :tall_people, -> {where(“height > ? “, 160)}
end

“`

DB
“` ruby:
class CreateHumen < ActiveRecord::Migration[7.0] def change create_table :humen do |t| t.string :name t.integer :hei

元記事を表示

array pushってこんな動きだったっけ? ?

# なんかおもったプッシュと違う

さっそくコードと結果
“`
@select_count = Array.new(9, [])

p @select_count[8]
p @select_count[8].push(38)
p @select_count
“`

予想してた結果
“`
[]
[38]
[[], [], [], [], [], [], [], [], [38]]
“`

結果
“`
[]
[38]
[[38], [38], [38], [38], [38], [38], [38], [38], [38]]
“`

# なんでこうなったか

2次元配列の初期化の方法が間違っていた

“`
@select_count = Array.new(9){ Array.new() }

p @select_count[8]
p @select_count[8].push(38)
p @select_count
“`

結果
“`
[]
[38]
[[], [], [], [], [], [], [], [], [38]]
“`

予想通りになりました。

# ま

元記事を表示

Ruby 計算プログラムの作成

# 計算プログラムの作成

二桁以上の整数を入力すると、十の位と一の位の数字の足し算、十の位と一の位の数字の掛け算をそれぞれ行います。
最後に2つの結果を足し合わせて出力するプログラムを作成します。

“`ruby
def addition(a, b)
a + b
end

def multiplication(a,b)
a * b
end

def slice_num(num)
tens_place = (num / 10) % 10
ones_place = num % 10
return tens_place, ones_place
end

puts “二桁の整数を入力してください”
input = gets.to_i

X, Y = slice_num(input)
add_result = addition(X, Y)
multiple_result = multiplication(X, Y)

puts “足し算結果と掛け算結果の合計値は#{add_result + multiple_result}です”
“`

## 解説
このプログラムをター

元記事を表示

OTHERカテゴリの最新記事