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

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

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

元記事を表示

M1 Macで古いRuby(2.3.0)をrbenvでインストールしようとしたらハマりました

新しくM1 Macを購入したので、過去のプロジェクト等で使っているRubyをインストールしようとしたら、思いの外ハマってしまいました。

前提として、rbenvでのインストールです。(rvmは同じ問題が出るのかはわかりませんが、出そうな感じでした)

## 普通にインストールしようとしたら

以下のようにエラーが出てしまった

~~~
rbenv install 2.3.0
Downloading openssl-1.0.2u.tar.gz…
-> https://dqw8nmjcqpjn7.cloudfront.net/ecd0c6ffb493dd06707d38b14bb4d8c2288bb7033735606569d8f90f89669d16
Installing openssl-1.0.2u…

BUILD FAILED (macOS 12.0.1 using ruby-build 20211109)

Inspect or clean up the working tree at /var/folders/5w/3gb4_24j54g14xnxsn0_czph0000

元記事を表示

Stripeで従量課金、かつ最初の数人は無料というサービスの設計

# はじめに
Stripeで下記のような従量課金の仕様で設計する方法をまとめました。Githubのようにチームメンバーが増えると共に使用量が増える料金モデルです。
もっと良い方法があったら教えて欲しいです。(最後の問題点というところにまとめました)

– 人数に応じて月額課金
– 最初の3人は無料
– 集計月の最大登録人数で課金

# 商品の追加
Stripeのコンソールで商品の追加->新しい料金の追加で下記のように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/f3575f95-3634-72fd-b46c-a9b8fc398d73.png)

これで最初の3人は無料、その後1人増えるごとに500円月額課金する料金体系ができました。
また、課金数量は集計月の最大数量で計算されます。(つまり課金の対象となる人数が増えたり減ったりしても、集計月の中で最大になった時の数が使われます)

似たようなもので数量ベースの料金体系がありますが、この場合数量が増えると最

元記事を表示

文字列の結合の種類

RubySilverの勉強中、文字列の結合のメソッドがいくつか出てきたので備忘録として記していきます。
##文字列の結合
文字列を結合する方法は主に + 演算子とconcatメソッド、<< の3種類あります。 concatと << は破壊的メソッドなのに対し、 + 演算子は非破壊的メソッドです。 ### + 演算子の使い方 ```ruby:例 s1 = Leo s2 = Messi puts s1 + s2 # => LeoMessi
“`

### concatの使い方
“`ruby:例
s1 = Leo
s2 = Messi

s1.concat(s2)

puts s1
# => LeoMessi
“`

### << の使い方 ```ruby:例 s1 = Leo s2 = Messi s1 << s2 puts s1 # => LeoMessi
“`

参考記事
[【Ruby】concatを使って文字列や配列を結合する](https://style.potepan.com/articles/27074.html)

元記事を表示

RSpecの導入と単体テストコードを書く

#①.nicknameに対するバリデーションを設定

サンプルアプリを例として、事前準備します!

実装時においては、nicknameに対してバリデーションを設けていません!

今回はバリデーションに関するテストを実装します!

そこで、「nicknameを入力しないと、ユーザーが登録できない」というバリデーションを設定します!

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 h

元記事を表示

RailsのCredentialsの作り方

Rails触った事ないけどある日突然production.keyを作成する事になり四苦八苦したので記録。

#Railsのproduction.keyとは

production環境の暗号化されたファイル**production.yml**を復号するためのキー。

【Ruby on Rails】production環境での秘密情報の管理(Credentials)

暗号化されたファイルにはプロジェクトの機密情報が含まれ、暗号化されたファイルをバージョン管理し、キーはバージョン管理から外す。
production.ymlというのは作成時に環境を指定したからこの名前になっており、基本的にはcredentials.ymlというのが暗号化されたファイルの名称。

#Credentialsの作り方(基本)

####既存のキーの確認方法
下記のような感じで確認する

“`shell
$ EDITOR=”vi” bin/rails credentials:show
# aws:
# access_key_id: 123
# secret_access_key: 345

# Used as the base se

元記事を表示

【Rails】定数の呼び出し方

##環境
Ruby 3.0.2
Rails 6.1.4.1

##定義と呼び出し方

“`ruby
class Hogehoge
TARGET_ARTICLES_COUNT = 100.freeze
end
“`

“`ruby
Hogehoge::TARGET_ARTICLES_COUNT
# => 100
“`

他のクラスやモジュールで定義された定数を参照するには“`::演算子“`を使って定数のパスを指定。
トップレベルの定数を確実に参照するにはパスを“`::“`から始めると外部の定数を絶対パスで指定できる。

##参考

https://railsguides.jp/constant_autoloading_and_reloading.html

元記事を表示

【Rails】lib配下にクラスを自作し読み込む方法

##環境
Ruby 3.0.2
Rails 6.1.4.1

rakeタスク内のメソッドをクラスに切り出してリファクタリングしたいときに使える。

“`lib/tasks/XXXXXX.rake
namespace :XXXXXX do
task hogehoge: :environment do
hogehoge = Hogehoge.new
end
end
“`

“`lib/hogehoge.rb
class Hogehoge
def hugahuga

end
end
“`
##設定方法

“`config/application.rb
module Futurama
class Application < Rails::Application ... config.paths.add 'lib', eager_load: true end end ``` ##参考 https://qiita.com/mk_0409/items/e930945a0c505ccbac9b

元記事を表示

ユーザーログインの有無で表示を変える実装!

#投稿者本人か確認して表示を変更

例でアプリを見ていきます!

今の状態だと、誰でも他ユーザーが投稿を編集・削除できます!

「ユーザーがログインしている」かつ「投稿したユーザーである投稿だけに許可」という実装をしましょう!

編集ボタンと削除ボタンの表示部分をif文で囲います!

“`php:app/views/eats/index.html.erb

<% @eats.each do |eat| %>

<%= image_tag 'arrow_top.png' %>

  • <%= link_to '詳細', eat_path(eat.id), method: :get

元記事を表示

Ruby、Railsのコーディング規則まとめ

#はじめに
企業や組織が公表しているRuby、Railsのコーディング規約をまとめました。チーム開発のように既にコーディング規約が定まっているのではなく、個人で開発している方は自分の好みの規約を導入してみてはいかがでしょうか?

![rails.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764771/4659b6e3-d675-1bb5-9eb0-417521fda010.jpeg)

#企業

#Cookpad

https://github.com/cookpad/styleguide/blob/master/ruby.ja.md

#Shopify

https://ruby-style-guide.shopify.dev/

#Airbnb

https://github.com/airbnb/ruby

https://qiita.com/tomoharutt/items/51254ae5dafba645dc6d

#Rubyの組織など

#Rubyスタイルガイド

https://g

元記事を表示

サクッとRailsの開発環境をDockerで構築してみる

## 環境

– macOS Catalina 10.15.6
– Docker 20.10.10
– docker-compose 2.1.1

## DockerでRailsの開発環境を構築する

公式ドキュメントを参考にDockerでRailsの開発環境を構築する。
[Quickstart: Compose and Rails](https://docs.docker.com/samples/rails/)

### ファイルを作成する

以下のファイルを作成する。

“`bash
$ mkdir hello_app/
hello_app$ cd hello_app
hello_app$ touch Dockerfile
hello_app$ touch docker-compose.yml
hello_app$ touch Gemfile
hello_app$ touch Gemfile.lock
“`

“`docker:Dockerfile
# syntax=docker/dockerfile:1
FROM ruby:2.5
RUN apt-get update -q

元記事を表示

sassc のインストールがおそすぎる

前々から思ってたけど `bundle install` のとき `sassc` のインストールがおそすぎる

そのせい `Docker` のイメージを作る際に タイムアウトエラーみたいになるのが頻発。

腹が立ったので調べた

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`
`bundler 2.2.24`

https://qiita.com/croquette0212/items/d2f48f30c3ed7dcd0e3c

どうやら環境の問題ではなくこの `gem` が悪いらしい

上の記事を参考にさせていただいて

“`
gem ‘sassc’, ‘2.1.0’
“`

`sassc` のインストールと 2.1.0 というバージョンを明示してやると解決

元記事を表示

rSpec 複数のセレクターを所得して配列みたいに指定する

## 前提
`rSpec` を使ってテストを書いている

## 本題

複数の同じクラスがあってその特定の要素を使用したいとき

“`
find(“.class”)[0]
“`

みたいな書き方はできない

`find` メソッドは一意な要素しか所得しない

上みたいの書き方をしたかったら

“`
page.all(“.class”)[0]
“`

みたいにする

元記事を表示

kaminari のメソッドのレシーバーが配列のときどうするか

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

上の画像では右側のユーザーが `current_user` なんだけど
自身のアカウントは検索画面で表示されないようにしたかった

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
`user` の認証機能があるアプリ
`slim` を使って書いている
`kaminari` のページネーションで `user` の一覧を表示している
検索機能を実装している

## next メソッド

まず考えたのは `next` メソッド

“`:user_html.slim
– @users.each do |user|
– if user == current_user
= next
“`
こんなかんじで繰り返し処理のなかで `current_user`

元記事を表示

【初心者向け】Rubyインストール時の注意点

###環境
・Windows10(64bit)
・Ruby2.6~3.0
・Windowsファイアウォール:無効
###Rubyインストール時の注意点
インストーラとしては、以下のように「Ruby+Devkit (バージョン) (x64)」を使用することが多いと思います。
その場合、Ruby本体とMSYS2が連続してインストールされます。

https://prog-8.com/docs/ruby-env-win

インストーラをダウンロードできたら、実行する前にセキュリティソフトを一時停止した方が無難です。
Avastの場合、`C:\Ruby(バージョンの数値)-x64\msys64\usr\bin`の以下ファイルが脅威と判定されました。
・gpg.exe
・gpg-agent.exe
・gpg-connect-agent.exe

:::note warn
一連のインストール完了後は元に戻すことをお忘れなく。
:::

###MSYS2インストール時の注意点
MSYS2インストール関連でエラーが出た場合、放置せずMSYS2の再インストールを行いましょう。
表示されるエラーを1つずつ

元記事を表示

rSpec all メソッドより page.all メソッドのほうがいい気がする

`ajax` な動作をテストしようとしたとき

“`
all(“input”)[0].set(“title1”
click_on ‘レビューを投稿する’
“`

みたいなテストを書いた。

このテストがとおったりとおらなかったり

適当に `speep` メソッドを散りばめても同じだった

## 開発環境
`ruby 2.6.5`
`Ruby on Rails 5.2.5`

## 前提
`rSpec` が導入されている
レビューを投稿するというボタンをクリックすると `ajax` でデータが反映される

## 結論

以下みたいにしたらうまくいくようになった

“`
page.all(“input”)[0].set(“title1”)
click_on ‘レビューを投稿する’
“`

`all` に `page` をつけてやる

推測なんだけど、`all` だけだと範囲がひろすぎて `set` メソッドの処理が追いついてないのかも
それならメソッド内での処理の話だから `sleep` メソッドをいれても関係なかったのもわかる

元記事を表示

OTHERカテゴリの最新記事