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

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

Ruby 2.5.0コンテナでRails6の開発環境を作るときのトラブルシューティング

こちらのハンズオンをやっていたところ、いくつかの問題に遭遇したので備忘録。

[Rails アプリケーションをコンテナで開発しよう ! 第 1 回 – まずは Rails アプリケーション作りから](https://aws.amazon.com/jp/builders-flash/202009/container-rails-app/?awsf.filter-name=*all)

## Rails7のインストールに失敗する

記事では Ruby2.5 & Rails6 を使用しているが、現時点(2022/1)での最新版は `7.0.1`。
エラーメッセージにもあるように`7.0.1` ではRuby2.7以上が必要であるため `gem install rails`に失敗する。

“`bash
root@810c33297af8:/work# gem install rails
Fetching: concurrent-ruby-1.1.9.gem (100%)
Successfully installed concurrent-ruby-1.1.9
Fetching: i18n-

元記事を表示

【Rails 6】Formオブジェクトでシンプルな検索機能を作ってみる

## 概要

記事タイトル通り、Form オブジェクトを使用したシンプルな検索機能を Rails6 で作ってみます。

Form オブジェクトの概念については、以下の記事の表現が非常にわかりやすかったので参考にされてください。

> Formオブジェクトはフォームの責務をカプセル化し、コントローラやビューを疎結合に保つために必要なデザインパターンです。

> ユーザの入力の整形や永続化をコントローラだけで行うと、コントローラが肥大化してしまいます。 この原因はコントローラがモデル層の知識をもちすぎるためにあります。 このときビューもフォームを表示するための知識をもつことになるため、コントローラと同じような問題が起こってしまいます。 このことは単一責任の原則に反し、モデル層の変更がコントローラやビューに影響を及ぼすことになります。

> 逆にActiveRecordモデルにこういった責務をもたせると、今度はActiveRecordモデルがフォームの知識を持ちすぎてしまいます。 フォームという独立した責務があるのであれば、これをひとつのクラスにカプセル化する、というのがFormオブジェクト

元記事を表示

掲示板にブックマーク(いいね)機能実装手順

##実装したいこと
・掲示板の☆ボタンを押すと、その掲示板をブックマーク/解除出来る機能。
・ユーザーがブックマークした掲示板を一覧できるページを実装。

##お気に入り機能実装の流れ
①中間テーブルとなるBookmarkモデルの実装
②Userモデルにbookmarkの定義を追加
③Bookmarksコントローラーの実装
④Boardコントローラーにbookmarkの定義を追加
⑤Routingの設定
⑥Viewの実装

##①中間テーブルとなるBookmarkモデルの実装
###Bookmarkモデルの仕組み(多対多)
**UserとBookmarkとBoardの関係**
Bookmarkモデルを実装する前に、モデルの関係を確認する。

・ユーザーはたくさんの掲示板をブックマークすることができる。
・反対に、掲示板はたくさんのユーザーにフォローされることができる。

つまり、UserもBoardもBookmarkをたくさん持っているということになる。このような関係を“多対多の関係“と言う。

[![Image from Gyazo](https://i.gyazo.com/a

元記事を表示

【Ruby】 &. (ぼっち演算子) の使い方

Ruby でたまに見かける **&.** というメソッドについて

# &. ってなに?
一般的に「ぼっち演算子」と呼ばれています。
Ruby 2.3 で追加されたメソッドです。

# どう使うの?
レシーバ + &. + 呼び出したいメソッド という形で使います。

以下の例では “hoge” という文字列をレシーバとし、
呼び出したいメソッドは upcase (小文字を大文字に変換) とします。

“`
irb(main):001:0> “hoge”&.upcase
=> “HOGE”
“`

# どういう時に使えるの?
レシーバが nil の可能性があるような場合、かつレシーバが nil なら nil を返してほしい時に使えます。

普通、レシーバが持っていないメソッドを使おうとすると NoMethodError が発生します。

例えば数字 (Integer) に対して upcase メソッドを使ってみましょう。
upcase メソッドは String 型に対して使うものであるため NoMethodError が発生します。

“`
irb(main):002

元記事を表示

【Ruby】引数をデフォルトで指定するときはキーワード引数を使おう

###キーワード引数

メリット

– 引数の順番を気にしなくていい
– 引数が何を指しているのかわかりやすい

####引数にデフォルト値を与える

“`ruby
def greet(name, message = ‘Hello’)
“#{message}, #{name}さん”
end

#messageを指定しないとデフォルト値がそのまま出力される
greet(‘Kato’)
#=> Hello, Katoさん

#デフォルト値を変更
greet(‘Kato’, ‘Hi’)
#=> Hi, Katoさん

#引数の順番を逆にすると意図してない動きをする
greet(‘Hi’, ‘Kato’)
#=> Kato, Hiさん
“`

####キーワード引数を使う

“`ruby
def greet(name: ‘名無し’, message: ‘Hello’)
puts “#{message}, #{name}さん”
end

#引数指定なし
greet
#=> hello, 名無しさん

#nameのみ指定
greet(name: ‘Kato’)
#=> Hello,

元記事を表示

gemを使わず複数ワード・複数カラムでのAND検索

自分が複数ワードでの検索機能を実装する際に結構調べたので備忘録として。

## 目標
複数ワードかつ複数カラムを跨いだ検索を可能にする。

## 開発環境
Ruby2.6.3
Rails5.2.5

# 実装方法

## ルーティングを記述

“`ruby:routes.rb
get ‘/search’ => ‘searches#search’
“`

検索ボタンを押したら、srarchesコントローラーのsearchアクションが実行されます。

## 検索フォーム(部分テンプレートにしています)

“`ruby:_form.html.erb
<%= form_with url: search_path, method: :get, local: true do |f| %>
<%= f.text_field :keyword %>
<%= f.submit "検索" %>
<% end %>
“`

検索フォームに入れた内容をkeywordとしてコントローラーへ送ります。

## controller

“`ruby:searches_controller.rb
d

元記事を表示

webpushのVAPIDでつかうapplicationServerKeyをrubyで作る

# 概要
rubyにはwebpush用のgemが作られているので、webpushを使いたい人はそちらを使うことをお勧めします。
https://github.com/zaru/webpush
以下はあくまで趣味として作った内容を記載しています。

Webpushを行う際の、[PushManager.subscribe](https://developer.mozilla.org/ja/docs/Web/API/PushManager/subscribe)に渡す`applicationServerKey`。これを自分で作ってみたいなと思いました。
[ここ](https://web-push-codelab.glitch.me/)で生成してくれますが、やっぱどう作られてるかって気になりますし。

# applicationServerKeyに渡す値は?
> https://developer.mozilla.org/ja/docs/Web/API/PushManager/subscribe
プッシュサーバーがアプリケーションサーバーを認証するために使用する 楕円曲線 DSA P-256 公

元記事を表示

【Rails】「【trタグ】とはなにか?」「【thタグ】と【tdタグ】の違いはなにか?」

##【trタグ】とはなにか?
・行を表すタグです。
・このタグの間に書かれたものが同じ行となります。

(例)商品名や個数を同じ行にする場合

“`

商品名 個数 価格

“`

##【thタグ】と【tdタグ】の違いはなにか?
・thタグ:見出し用のタグ。太字で中央揃いになる。
・tdタグ:通常文用のタグ。左揃いになる。

###thタグとは
・セルを意味するタグの1つ
・このタグの間にテキストを書く
・書かれた内容は見出しとなり太字で中央揃いとなる。

(例)「個数」という見出しにする場合

“`

個数

“`

###tdタグとは
・セルを意味するタグの1つ
・このタグの間にテキストを書く
・書かれた内容は通常の文となり左揃いとなる。

(例)数字を書く場合

“`

300

“`

>引用元:https://www.hibinokoto01.com/entry/2017/02/27/044737

元記事を表示

[py2rb] raw文字列

# はじめに
移植やってます。
# raw文字列 (Python)
“`python
r = r’R’
print(type(r))
print(r)
print(r == ‘R’)


R
True
“`
`python`の正規表現でよく`r”`って出てきますが、単なるストリングでした。

https://docs.python.org/ja/3.7/reference/lexical_analysis.html#index-19

# inspecct (Ruby)
“`ruby
r = /R/
puts r.class
puts r
puts r == ‘R’

puts r.inspect
puts r.inspect.class
puts r.inspect.gsub(/\//, ”) == ‘R’

Regexp
(?-mix:R)
false

/R/
String
true
“`
`Ruby`の`/`で囲まれた文字列はRegexpクラスですので、文字列と比較する場合変換する必要があります。

もしくは、いったん文字列で保管して

元記事を表示

userモデルを作る時に「undefined method `devise’」の解決法

#はじめに
 deviseを介してuserモデルを作る時に、「undefined method `devise’」というエラーが出て作成ができませんでした。ちょっとした記述ミスだったのですが、焦ったので備忘録としてまとめておきます。

#原因
 deviseは導入したはずだったのですが、遡ってみると

“`
% bundle install
% rails d devise install
% rails g devise user
“`
よくみてみると、「rails d devise install」という記述に「:」がない事に気がつきました。本来は「rails d devise:install」です。したがって今回の原因は「:」が抜けている事でした。。

しかし、問題は中途半端に処理は実行されていて、deviseのマイグレーションファイルは出来上がってしまっている事です。bundle install直後に戻さないといけません。

#対処法
 対処法としては以下の3つの手順を行いました。
①routes.rbに作られた、 「devise_for :installs」 という記述

元記事を表示

[Ruby]stringクラスのscanメソッド

学習したことのアウトプットとして

# scanメソッドとは
Ruby本体に組み込まれているライブラリで、 require を書かなくても使うことが可能。
対象の要素(stringクラス)から引数で指定した文字列を数え、配列として返すメソッドです。
正規表現で括弧を含む場合は、括弧で括られたパターンにマッチした部分文字列の**配列の配列**を返します。

(例)

“`ruby
“foobar”.scan(/../) # => [“fo”, “ob”, “ar”]
“foobar”.scan(“o”) # => [“o”, “o”]
“foobarbazfoobarbaz”.scan(/ba./) # => [“bar”, “baz”, “bar”, “baz”]

“foobar”.scan(/(.)/) # => [[“f”], [“o”], [“o”], [“b”], [“a”], [“r”]]
“foobarbazfoobarbaz”.scan(/(ba)(.)/) # => [[“ba”, “r”], [“ba”, “z”], [“ba”, “r

元記事を表示

【Ruby】繰り返し② timesメソッド

※初心者向け
※アウトプット練習の為

開発環境
rails 6.1.4.1
ruby 2.6.5

##問題内容##
1〜10までの数値を順番に足し合わせて、最後に全て足した結果をターミナルに出力するプログラムを書いてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2451862/46f590bf-1900-da13-522f-fc6139f48273.png)

**条件**:必ずtimesメソッドを使ってください。以下のようなプログラムはNGです。
**NGなプログラムの例**

“`csharp
sum = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
“`

##解答##

“`csharp
sum = 0

10.times do |i|
sum = sum + i + 1
end

puts sum

“`
もしくは自己代入演算子+=を使って

“`csharp
sum = 0

10.times do |i|

元記事を表示

[py2rb] re.match re.search

# はじめに
移植やってます。
# re.match re.search (Python)
“`python
import re
print(re.match(r’aaa’, ‘aaab’))
print(re.match(r’aaa’, ‘baaa’))
print(re.search(r’aaa’, ‘aaab’))
print(re.search(r’aaa’, ‘baaa’))


None


“`
`re.match`は先頭からのマッチになります。
こちらの記事が分かりやすい。

https://qiita.com/halhorn/items/9e6599a3422e7dd94ec8
# match (Ruby)
“`ruby
p ‘aaab’.match(/^aaa/)
p ‘baaa’.match(/^aaa/

元記事を表示

【Rails】Controllerの主な仕事内容

##Controllerの仕事内容
・Modelとのやり取りを行う。
・Viewに渡すインスタンス変数を定義する。
・表示するViewファイルを指定する。

元記事を表示

[py2rb] re.sub

# はじめに
移植やってます。
# re.sub (Python)
“`python
import re
s = ‘1A2B3C’
print(re.sub(r'[A-Z]’, ”, s))
print(re.sub(r'[A-Z]’, ”, s, count=1))

# 123
# 12B3C
“`
正規表現で一致した文字列を置換します。
`count`オプションで置換する回数を指定できます。
https://docs.python.org/ja/3.7/library/re.html#re.sub
# gsub (Ruby)
“`ruby
s = ‘1A2B3C’
puts s.gsub(/[A-Z]/, ”)
puts s.sub(/[A-Z]/, ”)

# 123
# 12B3C
“`
`Ruby`の場合、すべて置換する`gsub`/`gsub!`と最初に一致する文字列を置換する`sub`/`sub!`があります。

https://docs.ruby-lang.org/ja/latest/method/String/i/gsub.html

https:/

元記事を表示

GETとPOSTについて

##HTTPメソッドが「GET」になるのはどんな時?
・アドレスバーにURLを入力した時。
・google検索で出てきたサイトをクリックした時。

##HTTPメソッドが「POST」になるのはどんな時?
・会員登録をする時。
・ブログの投稿を行う時。

###GET=サイトの表示を得る(GET)のがGETリクエスト
###POST=データの送信をする(POST)のがPOSTリクエスト

元記事を表示

Rspecでsubjectに関数を指定し、何度も呼び出す方法

## subjectは記憶力が良い

subjectは記憶されるので、普通に書くと何度も呼び出すことは出来ません。

つまり、以下のようなテストは通らないということです。

“`rb
def increment
@i ||= 0
@i += 1
end

describe “increment” do
subject { increment }

it “increments i” do
expect(subject).to eq 1
expect(subject).to eq 2
end
end
“`

## Procを覚えてもらう

`proc`で囲ってあげましょう。
呼び出すときの`.call`も忘れずに。

“`rb
def increment
@i ||= 0
@i += 1
end

describe “increment” do
subject { proc { increment } }

it “increments i” do
expect(subject.call).to eq 1
expe

元記事を表示

【Ruby】繰り返し処理 times文

※初心者向け
※アウトプット練習の為

開発環境
rails 6.1.4.1
ruby 2.6.5

##問題内容##
times文を使って、以下のようにターミナルに出力されるプログラムを書いてください。

**ターミナル**

“`
1回目の繰り返し
2回目の繰り返し
3回目の繰り返し
4回目の繰り返し
5回目の繰り返し
6回目の繰り返し
7回目の繰り返し
8回目の繰り返し
9回目の繰り返し
10回目の繰り返し
“`

##解答##
“`csharp
10.times do |i|
puts “#{i + 1}回目の繰り返し”
end
“`

##解説##
times文を使えば、何度も繰り返される同じ処理をまとめることができます。今回まとめられるのは◯回目の繰り返しとターミナルに出力する部分です。

times文は繰り返したい回数.timesと記載して繰り返す数を決めます。今回は10回繰り返すので10.timesとなります。

“`csharp
10.times
end

“`

10.timesとendの間に、◯回目の繰り返しとターミナルに出力する処理を記述します

元記事を表示

【uniqueness: scopeの使い方】ブックマーク、いいね機能実装に使える

##uniquenessとは
バリデーションの1つ。Railsで一意であることを示す。
“scope“はuniquenessのオプション。

下記は人が投稿したものに対してブックマーク(いいね)機能を入れた時のmodel例。
1投稿に対して、1人のユーザーが1ブックマーク(いいね)しかすることができないため、このようなバリデーションになる。

“`models/bookmark.rb
class Bookmark < ApplicationRecord belongs_to :user belongs_to :board validates :user_id, uniqueness: { scope: :board_id } end ``` もし``scope``を付与せずにいると、 ```models/bookmark.rb validates :user_id, uniqueness: true ``` 「1投稿」に対して「1ブックマーク(いいね)」しか付けることしか出来ず、**早い者勝ちで一番最初に誰かがブックマーク(いいね)をしたら、それ以上その投稿

元記事を表示

migrationファイルのadd_indexは何なのか

##add_indexとは
よくマイグレーションファイルに“add_index :~“と記述があるがいまいち何でこれを書いているのか分からなかったので、調べてみた。

“add_index:“とは特定のカラムからデータを取得する際に、“テーブルの中の特定のカラムのデータを複製し検索が行いやすいようにする“ための記述。

多くのデータを格納するテーブルの、格納される値がそれぞれ異なるようなカラム(unique制約のかかったカラムなど)の中で、“検索がよく行われるカラム
に対してadd_indexの記述を張ることで検索を簡単にしたいときに使う。“

##記入法

“`
add_index :追加したいテーブル名, カラム名, 必要ならオプション名

#記入例
class CreateBookmarks < ActiveRecord::Migration[5.2] def change create_table :bookmarks do |t| t.references :user, foreign_key: true, null: false

元記事を表示

OTHERカテゴリの最新記事