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

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

Ruby 3.1.0 preview 1でTypeProf for IDEを試してみた

先日Ruby 3.1.0 Preview 1がリリースされました。

https://www.ruby-lang.org/en/news/2021/11/09/ruby-3-1-0-preview1-released/

先日のRubyKaigi Takeout 2021のKeynoteで発表があったようにRuby 3.1からTypeProfの Experimental IDE supportが実装されています。

https://rubykaigi.org/2021-takeout/presentations/mametter.html

面白そうだったのでちょっと触ってみて、「Rubyで静的型付けを使った現代的な開発体験」を体験してみました。

## 準備

“`bash
$ brew upgrade && brew upgrade rbenv ruby-build
$ rbenv install –list-all | grep 3.1.0
3.1.0-dev
3.1.0-preview1
jruby-9.3.1.0
rbx-3.100

$ rbenv install 3.

元記事を表示

Ruby で解く AtCoder ABC 227 D

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。

# 今回のお題
*[AtCoder Beginner Contest D – Project Planning](https://atcoder.jp/contests/abc227/tasks/abc227_d)*
Difficulty: 1643

今回のテーマ、二分探索 + 鳩ノ巣原理

青レートは難しいですが、解いてみました。
# Ruby
“`ruby
n, k = gets.split.map(&:to_i)
a = gets.split.map(&:to_i).sort
b =[0]
n.times do |i|
b[i + 1] = b[i] + a[i]
end
ans = (0..).bsearch do |x|
c = a.

元記事を表示

Pryのlsを使うと謎の^A^B^A^Bとかが表示されて格闘した話

## pryを0.14.1に更新したらなんかls機能が正しく動いてない

shellのlsではなく、pryのlsの話です

最後に付け加えていますが、0.14.1だからバグるという話ではないみたいです

## 問題の現象

“`ruby
pry> ls ActiveRecord::Base
“`

pryでページングが必要になるような長いリストを出力されるようなものをlsすると下の画像のような文字化けを起こす

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39804/b6606a0f-dee3-5394-e416-9f62566855f7.png)

## 解決方法

“`bash
export PAGER=” less –raw-control-chars -F -X”
“`

– 環境変数PAGERにlessをオプション付きで設定する
– lessの直前にある**スペースが とても とても 重要**

[pry/pry Non-Visible Characters P

元記事を表示

【RSpec】Railsチュートリアル第6版 第14章

#はじめに
Railsチュートリアル第6版のテストをRSpecで書き直していく。

###目次
– [第3章](https://qiita.com/supyolo888/items/35081ead2cfafb40a995)
– [第4章](https://qiita.com/supyolo888/items/939b670b62eb18467f6d)
– [第5章](https://qiita.com/supyolo888/items/42234ac2ed3919b14586)
– [第6章](https://qiita.com/supyolo888/items/bd10e64c77fe391cf203)
– [第7章](https://qiita.com/supyolo888/items/d2824ced26402b5f58d1)
– [第8章](https://qiita.com/supyolo888/items/508caaa40edf307093ed)
– [第9章](https://qiita.com/supyolo888/items/62e471b07a0c9a81575

元記事を表示

【Rails/carrierwave】画像データをsubmitしたらバリデーションエラーになった話

##やりたかったこと##
ユーザが画像を投稿する際に、投稿確認画面で内容確認後、画像投稿を完了させる。

##実行環境##
ruby 3.0.1
Rails 6.0.4.1

**使用gem:**
carrierwave
pry-rails (デバッグで使用のため)

##問題##
①確認画面(confirm view)から投稿ボタン(form_submit)を押すと、バリデーションエラーが発生する
②モデルに設定したバリデーションを解除し、再投稿したらNil location provided. Can’t build URI.が発生する
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259269/5f93d55f-bbb4-a6a4-ac49-582f527ab862.png)

##問題の発生理由##
**new viewからconfirm viewにページが移る際に画像のデータが渡されずに消えてしまう。**
①は確認画面に移る際にユーザーから渡された画像データがロストしてるため、画像デ

元記事を表示

デフォルト引数は意図がわかるように使いたい

コードレビューをしていて、使わないのにデフォルト引数を実装しているのを指摘することが多いです。
今後引数に渡し忘れてもいいように実装しているのかもしれないが、渡し忘れても動作するのはリスクが高いと思っています。
デフォルト設定を採用する場合、どうして採用したかがわかるような使い方がいいと感じたため、例を残しておきます。
(Rubyに関わらず当てはまると思うが、Rubyだと意識している人が少ないのかもしれないです。)

## 悪い例

この例では、arg2を引数に渡さないパターンが存在せず、今後の実装でarg2を渡し忘れた場合もエラーにならないため、
意図しない挙動をしても検知しにくくなってしまっています。

“`ruby
def do_something(arg1, arg2 = 0)
arg1 + arg2
end

# arg2が未設定で使用するパターンが存在しない
do_something(1, 2)
do_something(2, 3)
“`

## 良い例

この例では、arg2を使用しないパターンが存在しているため、
基本的にはarg1だけを渡す形で使用し、arg2

元記事を表示

Rakeタスクのメソッドと定数はどこに定義するか

##経緯

Rakeタスクの中でメソッドと定数を定義していたためリファクタリングしたかったときに参考記事が少なかったため独自で調べたこととその方法について書こうと思います。

“`ruby.rake
namespace :XXXXX do
task YYYYY: :environment do
#リファクタリングしたい定数の集団
CONSTANT1 = hogehoge.freeze
CONSTANT2 = hogefuga.freeze
CONSTANT3 = fugafuga.freeze
CONSTANT4 = fugahoge.freeze

################
# rakeタスク処理 #
################
end

#リファクタリングしたいメソッドの集団
private

def method1(arg)

end

def method2(arg)

end

def method3(arg1, arg2)

元記事を表示

Rails6 LINEログインとプッシュ通知

# 作るもの
LINEログインを利用し、アプリ上で登録したタスクを期限の日に通知をしてくれる簡単なLINEbot。
ちょこっといじくると期限の前日などに通知がくるようにもできます。
かなり雑な記事なのでわかりにくいところや間違いがあればなんでも言ってください!

![スクリーンショット 2021-11-18 18.39.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674324/49f3663b-6d5d-2bb2-d89f-6d801915dd2a.png)

![スクリーンショット 2021-11-18 18.41.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674324/2253b851-0a01-82c0-eb8d-b6af50370b95.png)

# 環境
– Ruby
– Ruby on Rails 6
– Heroku
– LINE Developers(LINE Messaging

元記事を表示

【rubyでcomet2を作る】①概要

### はじめに
 未経験からWebエンジニアを目指した際に基本情報技術者試験を受験しました。その際にCPUの機能や5大装置の関係性を学びましたが、なんとなく暗記しただけで実際には、あまりイメージ出来ていなかったと思います。就職活動も終わり、勤務開始まで少し時間がありましたので、改めて学習をしてみたいと思いました。
 現在は [放送大学の講義](https://v.ouj.ac.jp/view/ouj/#/navi/vod?ca=807)を参考にインプットを行なっています。アウトプットとrubyの学習のために擬似環境を作ってみたいと思います。rubyという高水準言語を用いて、低水準言語であるアセンブラを表現することは逆行的ですが、先にrubyやJAVAなどの学習を行なった人の理解の手助けになれば嬉しいです。
(rubyもコンピュータの基本動作についても初心者のため、誤った内容があればぜひご教授いただきたいです)

### 目次(現在1.まで執筆済み)
1. 概要(COMET2の概念をまとめる)
1. CPUオブジェクト、メモリオブジェクトを定義する1
1. CPUオブジェクト、メモリオ

元記事を表示

Fakerを導入

#①.Fakerフェイカー

ランダムな値を生成するGemです!

メールアドレス、人名、パスワードなど、さまざまな意図に応じたランダムな値を生成してくれます!

ここまでで、FactoryBotやbeforeをつかって、テストコードをスッキリとまとめることができました!

しかし、もう1つ対応しなければならないことがあります!

FactoryBotで設定した値は、’test@example’など固有のものでした!

しかし、これから複数のテストを行う際に、「すでにemailの重複したインスタンスが存在する」といったような意図しない形で弾かれてしまうことがあります!

beforeでインスタンスを生成する都度、値をランダムで生成したいところです!

その際に役立つものがFakerです!

#②.Fakerを導入

#Gemfileを編集

Gemfileに以下の様に追記します!

今回はFakerをテストコードのために使用するので、これまで同様group :development, :test doの中に記述します!

“`php:Gemfile
group :developme

元記事を表示

rails formタグについて調べてみた

## formタグににいて

button要素のタイプ指定

– `submit`は、ボタンをクリックするとフォームのデータを`

`要素の`action`属性で定義したWebページへ送信する
– `reset`は、ボタンをクリックすると、直ちに全てフォームウィジェットを既定値にリセットする。UXの観点では、resetはバッドプラクティスであると考えられている
– `button`は、クリックしても何も起こらない。JavaScriptを使用してカスタムボタンを作成する際に使用する

## フォームデータの送信

action属性を指定しなかった場合、フォームが表示されているページ自身に対してデータを送信する

getメソッドは、送信したデータをURLの?以降につけて送信する

postメソッドは、HTTPリクエストのリクエスト本文にデータを含めて送信する

特別なファイルを送信する場合

`enctype属性`に`multipart/form-data`を指定することで文字列以外も送信できる

[multipart](dust/multipart.md)

元記事を表示

【RSpec】例外処理が発生することをテストしたいときに気をつけること

例外処理が発生することをテストするときは“`()“`ではなく
ブロック“`{}“`で捉える

“`ruby
expect{ instance.method }.to raise_error(RuntimeError)
“`

##参考

https://qiita.com/jiz/items/0cd302bb16ce55d231cb

元記事を表示

【Rails】例外処理raise

##環境
Ruby 3.0.2
Rails 6.1.4.1

引数にメッセージのみ指定すると初期値のRuntimeErrorが発生する

“`ruby
raise ‘error message’
“`

第1引数に例外クラス、第2引数にエラメッセージを指定できる

“`ruby
raise NoMethodError, ‘error message’
“`

##参考

Ruby on Railsのraiseの使い例外を発生させる方法を現役エンジニアが解説【初心者向け】

https://mgmmy.hatenablog.com/entry/2019/12/01/232019

元記事を表示

【初心者向け】Railsのビューでエラーが表示されない・レイアウトが崩れる

###■環境
・Windows10(64bit)
・Ruby 2.7.4
・Rails 5.2.6
・devise 4.8.0
###■Railsのビューでエラーが表示されない
####状況
Railsアプリケーションにgem「devise」をインストールし、ビューは「users」ディレクトリ内に格納するようにした。
(デフォルトの app\views\devise ではなく app\views\users に)
そして、ビューのフォームを「form_for」から「form_with」に書き換えるなどカスタマイズした後から、ユーザ情報更新時などにビューでエラーメッセージが何も表示されなくなった。
####原因
1)「form_with」内に「local: true」を追加していなかった。
2)renderメソッドでのリソース指定を修正していなかった。
####対処
1)local: trueの追加

“`app\views\users\registrations\edit.html.erb
#修正前
<%= form_with(model: resource, scope: reso

元記事を表示

FactoryBotを導入

#①.FactoryBot

インスタンスをまとめることができるGemです!

他のファイルであらかじめ各クラスのインスタンスに定める値を設定しておき、各テストコードで使用します!

FactoryBotはGemとして提供されています!

Gemの導入を行います!

#Gemfileを編集

Gemfileを以下のように編集します!

この時も、group :development, :test doの中に記述するように注意してください!

“`php:Gemfile
group :development, :test do
# Call ‘byebug’ anywhere in the code to stop execution and get a debugger console
gem ‘byebug’, platforms: [:mri, :mingw, :x64_mingw]
gem ‘rspec-rails’, ‘~> 4.0.0’
gem ‘factory_bot_rails’
end
“`

記述後にbundle installを実行します!

`

元記事を表示

to_i(num)がつまづいた件

RubySilverの勉強中疑問に思ったことがあったので備忘録として記していきます。

##to_s と to_i 使い方
to_s => 数値を文字列に変換
to_i => 文字列を数値に変換

“`ruby:例
n = 8 
puts n.to_s #文字列に変換
# => 8

n = “8”
puts “8”.to_i # 数値に変換
# => 8
“`

##to_s と to_i に引数を設定
to_s と to_i に引数を設定することで基数を変えることができます。
to_s にも使えることは少し驚きでした。
下記の1つ目の例を解説すると
**10進数**の8を**2進数**で表すという処理を行っています。

2つ目は**2進数**の8を**10進数**で表すという処理を行っています。
2進数は0と1で表すので無視されます。よって、0が出力されます。

3つ目は**2進数**の100を**10進数**で表すという処理を行っています。
ここで100は百ではなく100という文字列であることに注意してください

“`ruby:例
n = 8
puts n.to_s(2)

元記事を表示

rationalizeメソッドとto_rメソッドの違い

# はじめに
rationalizeメソッドとto_rメソッド、どちらもレシーバーを有理数に変換したものを返してくれる「同じ」メソッドだと勘違いしてました。(sizeメソッドとlengthメソッドみたいな)
そんな私が、rubyコミュニティーの強い人たちに質問して得た知識をまとめます。
## to_rメソッドとrationalizeメソッドとは
レシーバーを有理数に変換します。同じ結果が取得できる時もあります

“`
a = 0.25

a.to_r ==>(1/4)
a.rationalize ==>(1/4)
“`

しかし

“`
b = 0.1

b.to_r ==>(3602879701896397/36028797018963968)
b.rationalize ==>(1/10)
“`
というふうに結果が異なる時もあります。

– to_rメソッド
https://docs.ruby-lang.org/ja/latest/method/Float/i/to_r.html
– rationalizeメソッド
https:/

元記事を表示

Railsで子モデルの所有数ランキングを取得するスコープの書き方

個人開発で必要になったのですが、どこにも書いておらず調べるのが大変だったので残しておきます。

“`ruby:app/model/parent.rb
class Parent < ApplicationRecord has_many :children, dependent: :destroy scope :how_many_children, -> { joins(:children).group(“parent.name”).order(count_all: :desc).limit(3).count }
# => {“親名”=>子テーブル所有数(一位), “親名”=>子テーブル所有数(二位), “親名”=>子テーブル所有数(三位)}
end
“`

今思えば[これ(Railsガイド)](https://railsguides.jp/active_record_querying.html#%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E9%A0%85%E7%9B%AE

元記事を表示

gem ‘date’のReDos脆弱性についての内容と対応の注意点 [CVE-2021-41817]

# 脆弱性の内容

`Date.parse`は、内部でRegexpsを使用しており、その一部は正規表現のサービス拒否に対して脆弱です。
このようなメソッドを信頼できない入力に適用するアプリケーションとライブラリが影響を受ける可能性があります。

## 脆弱性に対する修正内容

この修正により、正規表現を変更する代わりにデフォルトで入力長が最大128バイトに制限されます。
これは、’date’ gemが多くの正規表現を使用しており未発見の脆弱な正規表現がまだ存在する可能性があるためです。
互換性を維持するには次のようにlimitキーワードに明示的にnilを渡すことで制限を取り除くことができますが解析に時間がかかる場合があることに注意してください。

“`ruby
Date.parse(str, limit: nil)
“`
# 脆弱性への対応

日付gemをバージョン3.2.1、3.1.2、3.0.2、および2.0.1以降に更新してください。
`gem update date`コマンドを実行して更新することができます。
bundlerを使用している場合は、Gemfileに以下を追加し

元記事を表示

【Rails】seedファイルについて

## はじめに
今回Railsのアプリを作成中に多くのユーザー情報が必要となったことをきっかけに、
seedファイルを使用したので、備忘録です。
今回はuserの作成をします。devise導入済み。

## seedファイルとは
開発を進めていく中で、データを一件一件登録することはとてもめんどくさいですよね。
そのようなときにseedファイルを作成することで、初期データが作成できます。
大量なユーザー情報等を一気に作成することができるので、とても便利です。

## 導入してみる
簡単なものであれば特別なことは必要なく、ファイルに記述するのみです。
単体であれば

“`db/seeds.rb
User.create!(
email: “test@test.com”,
name: “test1”,
passward: “111111”
)
“`
複数であれば

“`db/seeds.rb
10.times do |n|
User.create!(
email: “test#{n + 1}@test.com”,
name: “test#{n + 1

元記事を表示

OTHERカテゴリの最新記事