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

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

Rubyのsuperはメソッドチェインできる

# 概要

> super は現在のメソッドがオーバーライドしているメソッドを呼び出します。括弧と引数が省略された場合には現在のメソッドの引数がそのまま引き渡されます。引数を渡さずにオーバーライドしたメソッドを呼び出すには super() と括弧を明示します。

https://docs.ruby-lang.org/ja/latest/doc/spec=2fcall.html#super

この`super`ですが、以下のようにメソッドチェーンすることで続きの処理を書くことができます。

“`ruby
def some_method
super.to_s
end
“`

# 詳細

例えば次のような受け取った引数を使って文字列を返すメソッドを持ったクラス`Klass`があるとします。

“`sample.rb
class Klass
def hello(arg: nil)
“Hello #{arg}!”
end
end

klass = Klass.new
result = klass.hello(arg: “World”)

puts result
“`

元記事を表示

RspecでAPIをテストするときにnullをパラメータに含む方法

# 問題

Ruby on Rails の Rspec で JSON を受け取る API をテストするとき、渡すパラメータの値に異常値も入れてテストしておきたいなぁと思います。よくある異常値として null がありますね。
でも、これをテストするのはちょっと難しいです。
なぜなら、チュートリアルでよくあるようにパラメータをハッシュにして API のエンドポイントに渡そうとすると、 null はハッシュの値として認めてもらえず、 ArgumentError になってしまいます。
ハッシュを `to_json` メソッドでJSONに変えようとしても同じことです。
ではどうしたら null をパラメータに含めてテストすることができるのか、考えました。

# 解決方法

JSON を文字列として作り、その JSON に null を含めたものを API のパラメータにすればOKです。
コードは以下になります。

“`null_spec.rb
require “rails_helper”

RSpec.describe “エンドポイントにnullを渡す”, :type => :request

元記事を表示

Userモデルの単体テストコードを書く

#①.事前準備

サンプルアプリを例にして、モデル単体テストの実装をはじめる前に、Userモデルのバリデーションを変更します!

#文字数制限のバリデーションを設置

「保存できる値は最大6文字まで」というバリデーションを設置します。
user.rbを開き、以下のように記述してください。

“`php:app/models/user.rb
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_many :eats has_many :comments # commentsテーブルとのアソシエーション

元記事を表示

【Ruby】抽象クラスを作る

##環境
Ruby 3.0.2
Rails 6.1.4.1

##抽象クラスとは

抽象クラスは、その特徴としてクラス自身はオブジェクトの実体、インスタンスを生成できない。
抽象クラスは主にそのクラスを親クラス(基本クラス)とした子クラス(派生クラス)を定義(継承)する前提で作製されるクラス。

Rubyではサポートされてないけどそれっぽいものを作れる。

“`ruby
class Parent
def method_1
raise ‘implement this method in subclass’
end
end

class Child < Parent def method_1 'hogehoge' end end ``` ```ruby parent_class = Parent.new parent_class.method_1 # => RuntimeError: implement this method in subclass

child_class = Child.new
child_class.method_1
# =>

元記事を表示

【RSpec】スタブとモック

##スタブ
オブジェクトのメソッドをオーバーライドし、事前に決められた値を返します。つまりスタブは、呼び出されるとテスト用に本物の結果を返す、ダミーメソッドです。スタブをよく使うのはメソッドのデフォルト機能をオーバーライドするケースです。特にデータベースやネットワークを使う処理が対象になります。
(引用:Everyday Rails – RSpecによるRailsテスト入門)

– メソッドの中のメソッドをスタブしてテストしたいとき

“`ruby
user = User.new
allow(user).to receive(:full_name).and_return(‘user’)
“`

##モック
本物のオブジェクトのふりをするオブジェクトで、テストのために使われます。モックはテストダブル(test doubles)と呼ばれる場合もあります。モックはこれまでファクトリやPOROを使って作成したオブジェクトの代役を務めます(訳注:英語の“double” には「代役」や「影武者」の意味があります)。しかし、モックはデータベースにアクセスしない点が異なります。よって、テストに

元記事を表示

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を実行します!

`

元記事を表示

OTHERカテゴリの最新記事