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

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

OmniAuthの公式のwikiを読んでみた。

##はじめに

[OmniAuthの公式のwiki](https://github.com/heartcombo/devise/wiki/OmniAuth:-Overview#facebook-example)を読んで学習した内容を備忘録としてこちらに投稿します。

##OmniAuthって?
Deviseのバージョン1.2から追加された、[OAuth](https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be)に関するモジュールのこと。
このモジュールを利用すれば、twitterやfacebookといったプロバイダーに登録されている情報でユーザー認証を行うことができます。

##Before you start
config.omniauthは、アプリケーションにomniauth プロバイダーのミドルウェアを追加します。これは、config/initializers/omniauth.rbにconfig.omniauthを記述するべきではないことを意味します。なぜなら、そうしてしまうとお互いのomniauth プロバイ

元記事を表示

Railsのform_withの使い方を素人ながらまとめました。

##form_withはフォームにす関するHTML要素を簡単に生成することができる便利なメソッド

まずフォームの値をデータベースに保存する際の書き方です。
↓railsでこう書くと

“`java
<%= form_with(model: @user, local: true) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>

<%= f.label :email %>
<%= f.email_field :email %>

<%= f.label :password %>
<%= f.password_field :password %>

<%= f.label :password_confirmation, "Confirmation" %>
<%= f.password_field :password_confirmation %>

<%= f.submit "Create my account",

元記事を表示

RailsのN+1問題をincludesメソッドで解決する

## アプリの概要(前提)
[![Image from Gyazo](https://i.gyazo.com/e4e30c01447d6af3ec95ce71221af4a9.gif)](https://gyazo.com/e4e30c01447d6af3ec95ce71221af4a9)

・こんな感じで、ユーザーaaaの投稿に対してコメントが6件ついていて、そのコメントと共に、コメントした人のユーザー情報(名前とプロフ画像)が載っている

・`/posts/8`にGETリクエストを送ると`views/posts/show.html.slim`が返される

・ユーザーaaaの`id`は`16`
・ユーザーoooの`id`は`17`

・Commentはbodyカラムを、Userはnameカラムとimageカラムを持つ

## N+1問題とは
N+1問題とは、データベースからデータを取り出す際に、必要以上にSQLが発行されることで、パフォーマンスが悪くなる(処理速度が遅くなる)問題のこと
## 具体例

先程のアプリのpostsコントローラー

“`ruby:posts_co

元記事を表示

バリデーションとは!

#①結論!

バリデーションとは、データの入力に制約をかけるという事です!

データを登録する際に、一定の制約をかけることを言います!

例えば、以下のようなものがあります!

・空のデータが登録できないようにする!(ブログ記事など)

・既に登録されている文字列を登録できないようにする!(メールアドレスの登録など)

・文字数制限をかける!(パスワードなど)

バリデーションを設ける際は、モデルにvalidatesメソッドを記述します!

#②.validatesメソッド

validatesとは、バリデーションを設定する時に使用するメソッドです!

以下が記述方法になります!

“`php
モデルファイルへ記述

validates :カラム名, バリデーションの種類
“`

これが書き方です!

続いて下記の例は、presence: trueと記述することで、nameカラムが「空ではないか」というバリデーションを設けています!

“`php
モデルファイルへ記述

validates :name, presence: true
“`

これで完成です!

このバリデーショ

元記事を表示

初めてのオリジナルアプリ公開までの道のり

# 公開までの道のり

月 | やってたこと
— | ———————-
5月 | tech camp(教養コース入学)
7月 | tech camp(転職コース入学、夜間休日タイプ)
8月 | カリキュラム終了
9月 | オリアプ作成開始
10月 | オリアプ完成

卒業予定は1月、笑

# 公開したアプリの概

## アプリ名
**FX-Traders**
https://fxtraders.jp

## どんなアプリ?
fx取引の記録を公開できるアプリになります。そしてその記録をもとにグラフを作り結果を解析できるアプリです。
それを公開することで

* 自身が決めた取引ルールの厳守
* 取引ルールのブラッシュアップ
* 第三者からのフィードバック
* 他者取引への理解

などを狙っています。

## なんで作ったの?
まずは自分で欲しかったから。一番大きな理由でもありますね。学生の頃にfxの記録を紙のノートに書いていて、画像を残せないのが残念で書くだけで満足していて、笑笑
こんなことを思っている人がたくさんいるんじゃないか?って思ったのも作った理由の

元記事を表示

`rails s` 実行時にRubyGemsのエラーが発生する

## 環境情報

– macOS Big Sur 11.6
– Ruby 2.6.1
– Rails 5.2.6

## 起きたこと

OSのアップデートやrbenvの再インストールを行った後、
`rails s` や `rails c` を実行した時に下記エラーが発生するようになってしまった  
(起きていた現象として、エラーが発生するだけで起動は行われる)

“`
/path/to/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/bundler-2.2.28/lib/bundler/rubygems_integration.rb:12: warning: already initialized constant Bundler::RubygemsIntegration::EXT_LOCK
/path/to/.rbenv/versions/2.6.1/lib/ruby/2.6.0/bundler/rubygems_integration.rb:12: warning: previous definition of EXT_LOCK wa

元記事を表示

Ruby 正規表現を使用して文字列からほしい文字を取得する!! 【gsubメソッド】【sliceメソッド】【scanメソッド】【最短マッチ】

[前回の記事](https://qiita.com/mm_st/items/3c613bdce6f18594355c)で取得したツイートから必要な内容を取得したい!!!と思い正規表現についてググったものをまとめていきます:)

# 正規表現
>正規表現(regular expression)は文字列のパターンを記述するための言語です。また、この言語で記述されたパターンも正規表現と呼びます。
正規表現を用いると、文字列が指定したパターンを含んでいるかどうかを判定し、また含んでいるならばそれが文字列中のどの場所であるかを知ることができます。

[Ruby 3.0.0 リファレンスマニュアル > 正規表現](https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html)

# 今回取得したツイート
このツイートから***値段*** ***ブランド*** ***アイテム名*** を取得したい!
> 【GUCCI】
インターロッキングGシルバー
¥40,700- tax in

>【Lansing store】
アロマキャンドル(4個)

元記事を表示

【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

元記事を表示

OTHERカテゴリの最新記事