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

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

【Rails】便利な正規表現まとめ

オリジナルアプリ作成にあたり使用した正規表現を、備忘録としてアウトプットします。

#英数字混合
※大文字・小文字の区別なし

“`
/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i
“`

#半角数字のみ

“`
/\A[0-9]+\z/
“`

# 全角(漢字・ひらがな・カタカナ)

“`
/\A[ぁ-んァ-ヶ一-龥々ー]+\z/
“`
・`ァ-ン`ではなく`ァ-ヶ`としているのは`ヴ、ヵ、ヶ`を含めるため。
・`一-龥`ではなく`一-龥々`としているのは`々`を含めるため。
・末尾に`ー`があるのは「ジュリー」「メアリー」などのハイフンを含めるため。

# 全角(カタカナのみ)

“`
/\A[ァ-ヶー]+\z/
“`

#電話番号10桁以上11桁以下(ハイフンなし)

“`
/\A[0-9]{10,11}+\z/
“`

#郵便番号(ハイフンあり)

“`
/\A\d{3}[-]\d{4}\z/
“`

#今回登場した正規表現のパターン表記一覧

`[a-z]`: 角括弧で囲まれた文字のいずれか 1個にマッチ
`\d`:数字にマッ

元記事を表示

[Rails]非同期(Ajax)でのコメント機能実装

## この記事の目的
非同期処理(ajax)でのコメント投稿機能を学んだのでアウトプットします
## 目標
[![Image from Gyazo](https://i.gyazo.com/13b13c9847585f462000a341b671e8b8.gif)](https://gyazo.com/13b13c9847585f462000a341b671e8b8)
## 要件
コメント投稿は非同期で行う
## 環境
・Ruby 2.7.1

・Rails 5.2.6
## 前提
・UserとPostは作成済み

・bootstrapとjquery-railsが入っている

## 設計
ER図
[![Image from Gyazo](https://i.gyazo.com/919c4a7bc8f4e5e4c7ff50fb2efcdab1.png)](https://gyazo.com/919c4a7bc8f4e5e4c7ff50fb2efcdab1)

ルーティング

“`
POST /posts/:post_id/comments comments#creat

元記事を表示

Gzip圧縮したデータを連結したデータはRubyのZlib::GzipReaderでは読めない

### 複数のGzipデータを連結した1つのデータ

gzipコマンドは複数のgzip圧縮されたファイルをcatで結合したものでも展開することができます。簡単な例をbashで見てみましょう

“` bash
date –iso-8601=ns | gzip > a.gz
date –iso-8601=ns | gzip > b.gz
cat a.gz b.gz > all.gz
gzip -dc all.gz # 2行出てくる
“`

RFC1952でファイルフォーマットについて説明があります。

https://datatracker.ietf.org/doc/html/rfc1952

Gzipファイルフォーマットは先頭10byteは必ずメンバ情報になっており、あとはメンバ情報のFLGによって可変長データが続くような形になっています。

この繰り返しなので、複数の圧縮されたデータがあっても、ひたすら展開して連結することで1つのデータが得られる仕組みになっているようです。上記の通り、gzipコマンドやzcatコマンドや著名なアーカイバ(7-zipとか)はサポートしています。

元記事を表示

WEBrickを使って動的なhtmlを返す(〜 GETとPOSTの違い 〜)

前回の記事([Webrickを使って静的なhtmlを返す](https://qiita.com/sonoyuki13/items/3dcfac99b05eca29cc19))の続き

### 前回作ったページ
##### 投稿フォーム

[![Image from Gyazo](https://i.gyazo.com/15917b5c8ef1b5665b08dc4a95d4f7d5.png)](https://gyazo.com/15917b5c8ef1b5665b08dc4a95d4f7d5)

##### 対応するhtml(一部)
“`html

GETで送る



元記事を表示

WEBrickを使って静的なhtmlを返す

WEBrickを使ってHTMLを返すというのを学習したので、アウトプットしようと思います。

####`http://localhost:8000/fom.html`にアクセスして以下の画面が表示されるようにする

[![Image from Gyazo](https://i.gyazo.com/15917b5c8ef1b5665b08dc4a95d4f7d5.png)](https://gyazo.com/15917b5c8ef1b5665b08dc4a95d4f7d5)

##### (1)まずWEBrickというライブラリを使ってWebサーバーを構築する
webrick.rbファイルを作成し以下のコードを記述

“`ruby:webrick.rb
require ‘webrick’

server = WEBrick::HTTPServer.new({
:DocumentRoot => ‘./’,
:BindAddress => ‘127.0.0.1’,
:Port => 8000
})
“`
##### 解説
・ __require ‘ラ

元記事を表示

#1.5 ユーザー編集機能

#はじめに
自己学習復習シリーズの#1.5になります。
自己学習の為に記事作成しております。
この記事が誰か1人の役に立ったら幸いです。
今回はユーザー編集機能編です。

##ユーザー編集機能作成においてすべき事
– users controllerにてeditアクション、updateアクションの作成&ストロングパラメーターの作成
– routes.rbにてルーティングの作成
– views/usersにedit.html.erbを作成し、編集フォームを作成
– マイページや編集ページに遷移できるようにリンクを作成する

以上の4点を行えば、ユーザー編集機能の実装を終える事ができる。

今回は丁寧に、
(1)ルーティングの作成(editとupdate/routes.rbにて)。
(2)editアクションの記述(users controllerにて)。
(3)edit.html.erbにて編集フォームを作成。
(4)updateアクションの記述(users controllerにて)&ストロングパラメーターの作成。
(5)マイページと編集ページにリンク作成。
の順で説明していきます!

元記事を表示

[Ruby]モジュールについて

# はじめに
本記事では、`モジュール`について記述します。

# モジュールとは
モジュールは、`機能`を1つずつ分けて`他のファイルから読み込める`ようにした`処理のまとまり`のことです。

“`ruby
module A
def A_method
“A_method”
end
end

class B
include A
def B_method
@B = 2
end
end

object = B.new
object.A_method
“`

moduleAをclassBにincludeすると、
moduleAに含まれているメソッドをclassBのインスタンスが使えるようになります。
“`

“`
「流れ」

object
↓クラスへの参照
クラスB
↓include
モジュールA

というような探索の流れになります。
“`

クラスが複数のモジュールをincludeした場合

“`ruby
module A
def A_method
“A_method”
end
end

module B
def B_me

元記事を表示

AWS メモリ不足時のEBSボリュームのファイルシステムを拡張

# はじめに
Capistorano を使った自動デプロイの実装中、
”bundle exec cap production deploy”を実行すると悲惨なエラーが起こりました。
一瞬、「不能」が「無能」に見えて心が折れそうでした。

“`:
(中略)
ar: vendor: mkdir 不能: No space left on device
DEBUG [7d5bfec5] tar: vendor/bundle/ruby/2.6.0/gems/websocket-extensions-0.1.5/README.md: open 不能: No such file or directory
tar: vendor: mkdir 不能: No space left on device
tar: vendor/bundle/ruby/2.6.0/gems/websocket-extensions-0.1.5/lib: mkdir 不能: No such file or directory
tar: vendor: mkdir 不能: No space left on device
t

元記事を表示

rails 7.0で`Enumerable.sum`を使用した時に発生するdeprecated warning (Rails 7.0 has deprecated Enumerable.sum in favor of Ruby’s native implementation available since 2.4.)について

rails 7.0では数値以外のArrrayで第一引数を指定せずに`Enumerable.sum`を使用していた場合に以下のdeprecated warningが発生します。

“`
Rails 7.0 has deprecated Enumerable.sum in favor of Ruby’s native implementation available since 2.4.
Sum of non-numeric elements requires an initial argument.
“`

# 理由

rails 7.1からrails実装の`Enumerable.sum`がなくなりrubyの`Enumerable.sum`を呼び出すようになる為、数値以外のArrayに対し`sum`メソッドを呼び出す場合には第一引数が必須となります。

# 詳細
rubyの`Enumerable.sum`は第一引数に対して`+`メソッドを実行します。
この第一引数のデフォルトが`0`なので数値の場合はそのまま処理ができますが例えば文字列の場合は`0`に対して`String`を`+

元記事を表示

Railsランキング機能(同率含む)

Railsでレビュー評価に基づくランキング機能の実装方法です。ランキングの作り方は他にも記事が出ていますが、同率(例えば1位が2つ合った場合、次が3位になる)の実装方法の記事はあまり見られなかったので、記事を残したいと思います。

**条件**

– 投稿(post)の評価(1~5)の平均に応じた降順のランキング
– Userモデル,Postモデル(投稿)が多対多の関係であり、中間テーブルのReview(口コミ)モデルが存在する
– ルーティングは任意

**STEP1**
任意のコントローラーにアクションを作ります。今回は`ranking`にしました。アクション内で評価に基づくデータの所得のコードを記入します。また、Reviewモデルの対象カラムは`rate`です。取得したデータを`@rank`に格納します。
データの取得方法ですが2つあります。

**ActiveRecordのメソッドを利用する場合**

“`
@ranks=Post.find(Review.group(:post_id).order(‘avg(rate) desc’).pluck(:post_id))
“`

元記事を表示

コントローラーを作成・削除

#①.コントローラーを作成!

ターミナルでコントローラーを作成する際のコマンドです!

コントローラーを作成する時は、命名を複数形にしましょう!

コマンドは下記の通りです!

“`php
# コントローラーを作成
% rails g controller コントローラー名
“`

例えばコントローラー名をeatsにすると、下記ののようになります!

“`php
% rails g controller eats
“`

正しく作成できれば以下の様な出力結果が表示されます!

“`php
# ターミナル:例

create app/controllers/eats_controller.rb
invoke erb
create app/views/eats
invoke test_unit
create test/controllers/eats_controller_test.rb
invoke helper
create app/helpers/eats_helper.r

元記事を表示

[Ruby] AtCoder過去問 D – Brick Break

##はじめに
AtCoder過去問D問題をRubyで解いてみました。
よろしくお願いします。

問題はこちらから確認してください↓

https://atcoder.jp/contests/abc148/tasks/abc148_d

##D – Brick Break
まずは入力を受け取ります。
後に、繰り返し文を使用して答えを出力させるので変数cntを用意して0を代入しておきます。

“`ruby
n = gets.to_i
a = gets.split.map(&:to_i)
cnt = 0
“`

この問題の引っかかりやすいポイントとして、レンガを一つも壊す必要がなかった時と、レンガを一つも壊せずすぬけが満足しなかった場合の出力を同じにしてしまうと不正解です。

前者は0を出力させます。後者はすぬけが満足していないので-1を出力させなければなりません。

簡単に言えば、とりあえず配列aに1が存在していなかったらすぬけは絶対に満足できないので-1を出力します。逆に1があればすぬけは必ず満足するので、レンガを壊した数を出力させます。

if文で-1を出力させる記述を先に書いてお

元記事を表示

.values if is_a?

* source

“`ruby
a = [“apple”, “bread”, “cookie”]
ah = {“a”:”apple”, “b”:”bread”, “c”:”cookie”}

def p_v(v)
r = v.values if v.is_a?(Hash)
end

p p_v(a)
p p_v(ah)
“`

* result

“`sh
nil
[“apple”, “bread”, “cookie”]
“`

## Refs.
* [is_a?(Arry)メソッド](https://qiita.com/ryuuuuuuuuuu/items/a6a610e1acbbcff45da8)
* https://docs.ruby-lang.org/ja/latest/method/Hash/i/values.html

元記事を表示

【Rspecエラー】HTTP Basic: Access denied

##環境
Ruby 3.0.2
Rails 6.1.4.1

##状況
Rspec実行時、401エラーが出た

“`
Failure/Error: expect(response).to have_http_status(200)
expected the response to have status code 200 but it was 401
“`

##解決法

responseの中身を確認

“`
> response.body
=> “HTTP Basic: Access denied.\n”
“`

Basic認証を採用していたことを思い出したので、テスト環境ではBasic認証をしないように指定

“`app/controllers/application_controller.rb
class ApplicationController < ActionController::Base before_action :basic_auth unless Rails.env.test? def basic_auth ...

元記事を表示

【DB】なぜ一意制約が必要か

##概要
####一意制約 (UNIQUE制約)
RDBでテーブルにデータを追加、更新する際の制約の一つで、その列の中でデータが一意(他と重複しない)でなければならないという制約。
重複したデータを入力しようとすると、DBMSによって拒否されエラーとなる。
Nullの制約は認められる。

これがなぜ必要なのかのメモ。

###なぜ必要か
データを取得する際に一意制約がないと、重複した必要のないデータまで取得してきてしまう可能性がある。
これを防ぐために、入力の段階から重複を許さない為のもの。

###同姓同名の場合は?
生徒に出席番号がついているように、、順番があり重複の要因のないもので識別してあげることができる。
ex) 出席番号、ID、背番号など。
さらに、出席番号を指定するとその生徒の情報(名前、性別、年齢、クラスなど)が芋蔓式で出てくるようにする。この時の出席番号をPK(primary key)と言う。
このPKを用いて同姓同名の生徒でも一意、個別に指定できる。
また、クラス内だけでなく学級、学年など、他の関連したテーブルとデータを結ぶ必要がある。今回はクラスがそれに当たる。こ

元記事を表示

Rails Twitter API を使用してツイートを取得する方法 (特定のアカウントのツイートの検索も)

# 目標
Twitter APIを使用して特定のアカウントのツイートを取得しDBに保存したい。
また取得したツイートの中に、特定のタグをが含まれているツイートのみを取得することを条件とする

# 前提
Rails 5.2.6
ruby 2.6.6
Article model作成済み
Articleのインスタンスにツイートの内容を格納させて保存したい

# Twitter APIとは
>TwitterのAPIプラットフォームは、プロバイダユーザーが世界で共有する設定にしている一般のTwitterデータへの広範囲でのアクセスを提供します。APIによってユーザーが非公開のTwitter情報(ダイレクトメッセージなど)を管理できるようにし、またこの情報を、許可した開発者に提供するようにもします。

詳しくは [TwitterAPI](https://help.twitter.com/ja/rules-and-policies/twitter-api)

# Twitterアカウント申請
私の場合、1日で承認された!
長くなるので参考にさせていただいたサイトはこちら
[Twitter API

元記事を表示

#1.25 ActiveStorageの導入&各ページの微修正

#はじめに
この記事は、自分の制作物の流れに沿って作成している記事です。
次の記事は#1.5のユーザー編集ページの作成でしたが、その前にページの中身記述や、ActiveStorageの導入などに気付き、この中途半端な#になってしまいました。

#目次
1.ActiveStorageの導入
2.Topページの作成
3.users/showページの中身作成

##1.AWS Cloud9で新しくIDE(開発環境)を立ち上げる
流れとしては、、、
①RailsアプリケーションにActiveStorageをインストール
⬇︎
②画像プロセッサのgemを導入
⬇︎
③モデルに記述
⬇︎
④ストロングパラメーターに記述(今回はやりません。次回の#1.5で記述します。)
という流れになります。この流れで説明していきます。
####①RailsアプリケーションにActiveStorageをインストール
“`
$ rails active_storage:install
“`
ActiveStorageを利用するために必要なマイグレーションファイルが生成される。

“`
$ rails db:mi

元記事を表示

変更内容を非難させる git stash でやらかしたこと

過去にgit addしていて、コミットしていないファイルについてはgit stashで対応できますが、過去にgit addしたことのないマイグレーションがある状態でgit stashをしてブランチを切り替えて作業することはNG

“`zsh
Untracked files:
(use “git add …” to include in what will be committed)
db/migrate/20211004063538_add_order_number_to_cards.rb
“`

この状態で、git stashを行っても追跡されていないファイルにマイグレーションファイルが存在し、切り替えたブランチ先に追跡されていないマイグレーションファイルを持ち込んでしまう。

この際のエラーが出た場合は、2パターン解決策がある
# ロールバックをして、データベースの整合性を取る方法

“`zsh
$ bin/rails db:status

database: db/development.sqlite3

Status Migrat

元記事を表示

#1 ユーザー認証、ログイン機能

#はじめに
自分の学習復習のために、アプリを一から作成する手順を記事にしてます。
今回は #1 のログイン機能になります。
#0と#0.5も記事にしてますので、準備段階から見たい方はそちらを参照してください。

#目次
1.gem ‘devise’をインストール、初期設定
2.ユーザーテーブル作成、マイグレーションファイル編集
3.deviseのstrong parametersを設定
4.ユーザーの登録画面の編集、ログアウトボタンの追加
5.ログインの遷移先設定、遷移先のページ作成

##1.gem ‘devise’をインストール、初期設定
“`ruby:Gemfile
gem ‘devise’
“`
Gemfileにdeviseを追加。(最下部に追加)

“`Ruby
username:~/environment/snow-review $ bundle install
“`
bundle installを行い、アプリケーションに読み込ませる。

“`Ruby
username:~/environment/snow-review $ rails g devise:ins

元記事を表示

RalisのMVCモデルを分かりやすくどう説明するか

##はじめに

どうも、27歳未経験からエンジニア転職を目指しているもきおです。

これは当時プログラミングスクール卒業したての頃、エンジニア採用面接でのお話

**面接官**「えーそれではMVCモデルを説明してもらえますか?」
**もきお**(はい、来たその質問。)「モデル,ビュー,コントローラーの略で情報処理をこれら3つで分割して行うモデルのことです。コントローラーが情報を受け取り、DBとの連携が必要な場合はモデルとやりとりを行います。その後、必要な情報をビューに表示させるという流れです」(よし、ちゃんと言えた。ドヤっ)
**面接官** 「えーじゃあMVCモデルをここにいるIT知識の乏しい人事の方にもわかるように説明してみてもらえますか?」
**もきお**(おっと、その展開は聞いてない。)

こんな感じでその企業からは内定はいただけたのですがMVCモデルをIT知識があまりない方に対しても分かりやすく伝える事ができず、悔しい思いをしました。

ここで今回はMVCモデルを分かりやすく伝えるためにはどうすれば良いか考えていきたいと思います。

##MVCそれぞれの役割
まず改めてMVCそ

元記事を表示

OTHERカテゴリの最新記事