Ruby関連のことを調べてみた2020年09月25日

Ruby関連のことを調べてみた2020年09月25日
目次

FizzBuzz問題を解いてみよう!

【概要】
—————————————-
1.結論

2.FizzBuzz問題とは何か

3.どのようにプログラムするのか

4.ここから学んだこと

1.結論
—————————————-
eachメソッドとif..elsifを組み合わせよう!

2.FizzBuzz問題とは何か
—————————————-
(i)1~100の数字を出力する際に、
(ii)3の倍数は”Fizz”
(iii)5の倍数は”Buzz”
(iv)15の倍数は”FizzBuzz”
を表示させる

というプログラムです!
基本的なことが理解できているかを試せる問題として有名です!

3.どのようにプログラムするのか
—————————————-

今回は使用する言語は”Ruby”になります。

“`ru

元記事を表示

scanメソッド問題

##問題
任意の文字列で
“hi”がいくつあるか数えてその数を出力するメソッドを作りましょう。

##出力例
count_hi(‘abc hi ho’) → 1
count_hi(‘ABChi hi’) → 2
count_hi(‘hihi’) → 2

##scanを使う
scanは、対象の要素から引数で指定した文字列を検索して配列として返すメソッドです。

##scanの使い方
正規表現と使う場合がほとんどですが、正規表現でなくても文字列を検索して配列として返したい場合にも使うことができます。

記述方法は、オブジェクト.scan(正規表現)という書き方をします。

##問題の回答

“`qiita.rb
def count_hi(str)
puts str.scan(“hi”).length
end
“`
引数strにscanメソッドを使用する。
今回は”hi”がいくつあるかを数えたいので、文字列の長さと配列の長さを調べるためのメソッドであるlengthメソッドを用いて出力する。

元記事を表示

【Ruby on Rails】パラメーターのid取得がうまくいかなかった時

# 目標
id情報を取得する。
パラメーター関連でうまくいかないときの解決手順の参考になれば幸いです。

# 開発環境
ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina
google chrome

# 前提
※ ▶◯◯ を選択すると、説明等が出てきますので、
  よくわからない場合の参考にしていただければと思います。

今回はパラメーターのid取得で躓いてしまったため、
備忘録として記載させていただきます。

# 状況
– 投稿機能は実装済み
– 削除機能の実装を試みる
– コントローラー、ルーティング、viewそれぞれ記述
– destroyがnilになる。

これらを解決していきます。

# controllerを疑う

“`rb:app/controllers/img_searchs_controller.rb
def destroy
# binding.pry
@img_searchs = current_customer.img_searchs
@img_search = @img_searchs.find

元記事を表示

【Rails】on: :actionの条件付きで設定したコールバックはskip_callback、set_callbackを用いて回避することができない

skip_callbackとset_callbackを用いて一時的にコールバックを回避しようとしたらset_callbackがうまくいかなかった。その時の状況と回避策を記録。

### やりたいこと
こちらのコールバックを一時的にスキップしたい。
“`ruby
before_validation :func, on: :action
“`

### 最初にやったこと
`skip_callback`、`set_callback`を用いて実装した。

“`ruby
skip_callback(:validation, :before, :func)
——————————————
# 処理を実行
——————————————
set_callback(:validation, :before, :func)
“`

しかし、このあと他の動作に不具合が出てしまい、原因を調査した。

#### skip_callback、set_callbackとは

`skip_callba

元記事を表示

【Rails】ローカル環境のデータがおかしいから全部リセットしたい!と思うその前にすべきこと

## はじめに

以下のQiita記事を拝見しました。

[エラーが解決しない時は、元を断つという考え方 \- Qiita](https://qiita.com/TeppeiMimachi/items/755639c775c72cb73ad9)

詳しくは上記記事を読んでもらいたいのですが、簡単に要約すると「ローカル環境のデータがおかしくなったら、(データを消しても問題ないことを確認したうえで)データベースを再作成しよう」という内容です。

ただ、個人的には「うーん、あまりよくないな」と思ってしまったので、返信コメントを書こうと思いました。
コメントを書き始めたらかなり長くなってしまったので、独立した記事にしてしまおうと思いました。
それが本記事になります。

というわけで、ローカル環境のデータがおかしいから全部リセットしたい!と思うその前にすべきことを以下にまとめます。

## ローカル環境のデータがおかしいから全部リセットしたい!と思うその前にすべきこと

(注:以下の内容はもともと[冒頭に載せたQiita記事](https://qiita.com/TeppeiMimachi/it

元記事を表示

【Rails】開始時刻と終了時刻を保存する

# 開始時刻と終了時刻を保存する
railsで、タスクの開始時刻と終了時刻を保存するプログラムを作ります。
自己流の部分が多いので、あくまでやり方の1つとして参考にしてくださると幸いです。
※今回は、開始、終了時刻を保存することをメインに扱います。削除、編集機能や見た目は勘弁してください。

![画面収録 2020-09-25 2.57.23.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566871/80c7b5e2-fea2-c5b6-e5e8-09e0af4c518f.gif)

# 考え方
開始、終了フォームを1度だけしか押せない仕組みを目指します。
具体的には、タスクの開始時刻のデータが入っている場合は開始ボタンを表示しないように、ビューの中にif文を書きます。
この考えに至った経緯は、以下の通りです。

・タスク(Task)に、開始時刻(StartTime)と終了時刻(StopTime)を紐付ける
 →問題点:何回でも開始し、終了できてしまう。
・StartTimeのデータが入って

元記事を表示

エラーが解決しない時は、元を断つという考え方

どうも、三町哲平です。

プログラミングをしていたら必ずエラーに出会す場面が出てきます。
簡単に解決できるエラーもあれば、何時間、下手したら数日掛かっても解決しないそんなやる気すら失ってしまうエラーも存在します。

そういうやる気を失ってしまう時に役立つエラーに使えるかも知れないテクニックを一つ紹介します。
尚、今回はRuby on Railsで発生したエラーですが、データベース絡みのエラーだとRails問わず、どのプログラミング言語での開発環境においても効果的です。

今回は、エラー発生から3日掛かって解決しましたので、短くわかりやすくまとめてみました。

# まず、結論
この記事の概略を説明すると、
__データベースが元の異常ぽかったら、データベースを再作成した方が早いよ。__
ていう話。

では、3日間の闘いをどうぞ!

## 1日目. Template::Error
![スクリーンショット 2020-09-09 13.33.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/480

元記事を表示

DockerでRails + Vue + MySQLの環境構築をする方法【2020/09最新版】

# はじめに
フロントにVue、APIサーバにRailsという組み合わせは日本ではメジャーな構成の一つです。今回はこの構成をDockerを使って構築していきます。

この記事を読むことで、以下の構成をDocker作成出来るようになります!
API: **Rails 6系**
フロント:**Vue(TypeScript) 2系**
DB: **MySQL 5.7**

## 環境構築の流れ
1. Rails、VueのDockerfile作成
2. docker-compose.yaml作成
3. Rails、Vueのプロジェクト作成

最終的なディレクトリ構成は以下のようになります。

“`
[project_name]
├── api // Rails
│   ├── Dockerfile
│   ├── …
├── docker-compose.yaml
└── front // Vue
   ├── Dockerfile
├── …
“`

では環境構築に入っていきましょう!

# 1. ディレクトリ作成
プロジェクトディレクトリとその配下にAPI、フロン

元記事を表示

Ruby on Rails 〜MVCとルーターの基礎〜

#はじめに
本記事では、MVC(Model(モデル)、View(ビュー),Controller(コントローラー)とRouter(ルーター)の関連を確認しながら、用語について解説していきます。

#Router(ルーター)とは
RouterはHTTPリクエストがあったURLに対して、アプリケーション内のどの機能を結びつけるを決める役割を果たします。そして次に説明するControllerに1つのメソッドを割り当てます。

#Controller(コントローラー)
“Controller”はMVCパターンの司令塔的役割を果たします。
これは、ユーザから送られてきたHTTPリクエストの処理を担当します。そのHTTPリクエストはRouterからControllerの1つメソッドと結びつきます。
そしてControllerはHTTPリクエストに対応したModelの作成や取得、取得した値をViewに渡して処理を行わせる、というようなことを行います。
つまりModelやViewに命令を出すことがControllerの仕事です。

#Model(モデル)
“Model”はデータとやりとりをしてくれる存在

元記事を表示

【Rails】ページの上部に戻るボタン

## はじめに
・Railsを使用してアプリケーションを開発
・viewsの下部地点から上部に戻るボタンを設置する

Ruby 2.5.7
Rails 5.2.4.4

## 流れ
・“`gem ‘jquery-rails’“` を導入
・アクションを起こすボタンを用意(画像でなく文字やfont-awesome等でも代用可能)
・viewにボタンを記載しcss及びjavascriptへ追記

## ボタン画像
![top_btn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705913/7903465d-ed58-f189-fab1-45198f70b9b6.png)

適当に準備します・・・

画像ファイルをapp/assets/images配下に格納

## viewsへ追加
“`ruby



<%= image_tag asset_path('top_btn.png'), class: 'top-btn' %>

元記事を表示

再帰処理の流れについて基本的な理解を目指す

 「自分自身を呼び出す」再帰的関数に関するコード記述を読んでも、なかなか理解が追い付かずに折れかけたので、自戒を込めて「再帰処理の流れについて基本的な理解を目指す」をテーマに記事を書いてみたいと思います。
 下記のシンプルなコードを用いてどのような流れで関数が実行されているか、考えてみます。

####再帰的関数

“`rb
1 def recursive(n)
2 p ‘a’
3 p n
4 return 1 if n == 0
5 p n
6 n * recursive(n – 1)
7 p ‘b’
8 p n
9 end
10
11 p recursive(5)
“`
実行すると、下記のとおり。
![recursive1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698990/93bfd2e6-6896-78de-c445-52691ed426c5.png)

初見、なぜ数字が0から増えていくのかがまったく分からずに混乱しまし

元記事を表示

単体テスト時、ActiveRecordの暗黙的型変換でハマった話

# 事象
以下の単体テストコードが失敗してしまう。

“`ruby:item_spec.rb
it ‘priceが半角数字でなければ保存できないこと’ do
@item.price = ‘1000’
@item.valid?
expect(@item.errors.full_messages).to include(‘Price Half-width characters.’)
end
“`

#原因
integer型の項目「price」への文字列「1000」代入時、
暗黙的型変換が行われ、priceには数値「0」が代入されたため。

↓暗黙的型変換が行われる様子をコンソールで確認↓

“`
irb(main):002:0> @item.price = ‘1000’
=> “1000”
irb(main):003:0> @item.price
=> 0
“`
文字列「1000」を代入した後のpriceの値は数値「0」となります。

これはRails 5から追加された「ActiveRecord Attributes API」と

元記事を表示

Rails APIモード キーワード複数検索機能を配列と繰り返し処理を使って実装してみた。

## 機能として成り立つ前
“`ruby
def keyword
if params[:keyword]
keywords = params[:keyword].split(/[[:blank:]]+/).select(&:present?)
keywords.each do |keyword|
offices = Office.where(‘name LIKE ? OR address LIKE ? OR near_station LIKE ? OR introduction LIKE ? OR company LIKE ?’,”%#{keyword}%”, “%# {keyword}%”, “%#{keyword}%”, “%#{keyword}%”, “%#{keyword}%”)
end
else
pagy, offices = pagy(Office.all)
pagy_headers_merge(pagy)
end
render json: of

元記事を表示

[Rails][jQuery] remote:trueとjs.erbを使って非同期のいいね機能実装

#概要
Railsプロジェクトで掲示板サイトを作成中、`remote:true`と`js.erbファイル`を用いた非同期のいいね機能を実装する機会がありました。
備忘録としてここに手順を残しておきます。

#前提
Rails 5.0

`favorites_tableの作成`と`モデルのアソシエーションを定義`は既にされているものとします。

**アソシエーション:**
`users – has_many :posts, has_many :favorites`
`posts – belongs_to :user, has_many :favorites`
`favorites – belongs_to :user, belongs_to :post`

#jQueryの準備
Rails内でjQueryを使えるように準備します。
まずはgemの導入します。

“`ruby:Gemfile
gem ‘jquery-rails’
“`

ターミナルで**`bundle install`**します。
そして`application.js`に記述を追加します。

“`ruby:appli

元記事を表示

2020年で最も需要のあるプログラミング言語

本記事は[Most in-demand programming languages in 2020](https://lampstudy.net/most-in-demand-programming-languages-in-2020/)の日本語訳です。翻訳元に報告していますが、もし苦情が来たら消します。
翻訳は不慣れなので変なところもあると思いますが、ご容赦ください。


![Most-in-demand-programming-languages-in-2020.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321705/bf03a2a8-203a-0198-e24d-8019b794c52d.jpeg)

ソフトウェア開発業界は絶えず変化しており、それは開発者の能力に対する企業のニーズも変化していることを意味します。そのため、あなたが想像できるように、Webアプリケーション、ゲーム、アルゴリズムなどのあらゆる側面の開発をカバーするために、選択できるプログラミング言語はたくさんあります。その

元記事を表示

【Rails】ドット(.)とか、コロン(:)とは一体

`::`とか、`.`とかよくお見かけします。
これはメソッドの呼び出しの違いで、表記が変わるという種明かしなんです。

#ドット記法

“`ruby:
class User
def method
puts “Hello”
end
end
“`

“`ruby:
> user = User.new

> user.method
Hello
=> nil
“`

#コロン記法

“`ruby:
class User
def method
puts “Welcome”
end
end
“`

“`ruby:
> user = User.new
> user::method
Welcome
=> nil
“`

###ドット記法とコロン記法の違い

ドット記法とコロン記法の違いは、`定数を呼び出せる`かどうか。

| 記法 | メソッドの呼び出し | 定数の呼び出し |
|:-:|:-:|:-:|
| ドット記法 | ○ | × |
| コロン記法 | ○ | ○ |

###Rubyでは、クラスやモジュールも定数として扱われる

元記事を表示

Rails6のマルチDBの自動切換(ActiveRecord::Middleware::DatabaseSelector)の実装を読んでみる

## 概要

![](https://img.shields.io/badge/rails-v6.0.3.2-)
Rails6.0より実装された複数DB対応に関して、自身のプロジェクトに適用できるか?という判断のために実装を追ってみます

## Railsガイドでの記載

https://railsguides.jp/active_record_multiple_databases.html#コネクションの自動切り替えを有効にする

> 自動切り替え機能によって、アプリケーションはHTTP verbや直近の書き込みの有無に応じてprimaryからreplica、またはreplicaからprimaryへと切り替えます。
> アプリケーションがPOST、PUT、DELETE、PATCHのいずれかのリクエストを受け取ると、自動的にprimaryに書き込みます。書き込み後に指定の時間が経過するまでは、アプリケーションはprimaryから読み出します。アプリケーションがGETリクエストやHEADリクエストを受け取ると、直近の書き込みがなければreplicaから読み出します。

H

元記事を表示

組み合わせ爆発ハラスメントの処方箋

プログラミング初学者向けの内容です。
今のところ Golang, Ruby, Python, JavaScript, TypeScript による処方箋のみ掲載しています。

# ある日のこと

知人「店長からさぁ、

   『うちはメニューの数が少ないから、
    コンビ・メニュー作ることにした』

   『とりあえず、
    今あるメニューを組み合わせて、
    単品から全部入りまで
    すべての組み合わせのリスト作ってくれ!』

   って、言われたんだけど…」

俺「え? それって、
  ???があるとしたら、
  ↓みたいなやつ?」

1:?
2:?
3:? ?
4:?
5:? ?
6:? ?
7:? ? ?

知人「そう。そう。それ!それ!」

俺「作れるけど、、
  きっとものすごい数になるよ。
  単品メニューって何種類くらいあんの?」

知人「20種類くらいかなぁ。。
   物好きな店長でしょ?!
   めんどくせぇ。。」

俺「…」

俺「あのさぁ、、
  面倒くさいとかの次元じゃないんだけど。。」

俺「0.1 mm 厚の紙を 26 回折っ

元記事を表示

CodeWarでの勉強

##この記事について
最近始めたCodewarを通じて学べたことを少しずつアウトプット

##学び① joinメソッド

>Write a function that accepts an array of 10 integers (between 0 and 9), that returns a string of those numbers in the form of a phone number.

“`ruby
#僕の回答
def createPhoneNumber(numbers)
return “(#{numbers[0]}#{numbers[1]}#{numbers[2]}) #{numbers[3]}#{numbers[4]}#{numbers[5]}-#{numbers[6]}#{numbers[7]}#{numbers[8]}#{numbers[9]}”
end

#理想の回答
def createPhoneNumber(str)
“(#{str[0..2].join}) #{str[3..5].join}-#{str[6..10].join}”

元記事を表示

Railsでログイン機能をシンプルに名前とパスワードだけで実装する(3)

##[前回](https://qiita.com/yongjugithub/items/65fcdf73e42857297321)の続き

##概要
前回まででログイン機能はできたものの、現在の状態ではどのユーザーがログインしているか分からず、またログインしなくても一覧ページにアクセスできるという欠陥が残っている。それに対処していく

##手順
– current_roomメソッド。現在のログインしているユーザーを表示するヘルパーメソッドを追加する

“`app/helpers/sessions_helper.rb
# ログインしているユーザーがいたら、ユーザーを代入する
def current_room
if session[:room_id]
@current_room ||= Room.find_by(id: session[:room_id])
end
end
“`

– 今回はページに共通した部分がないので、不要ですが、必要ならログインしているかどうかを判断するヘルパーメソッドを定義します。

“`app/helpers/sess

元記事を表示

OTHERカテゴリの最新記事