Ruby関連のことを調べてみた2022年03月09日

Ruby関連のことを調べてみた2022年03月09日

GyazoのURLをマークダウン記法に変換する方法

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

元記事を表示

githubで戻る方法

# コミットの取り消し
– 直前のコミットをなかったことにする
“`
git reset –soft HEAD^
“`
– 直前のコミットを取り消し
“`
git reset –hard HEAD^
“`
– コミット後の変更を全部消したい
“`
git reset –hard HEAD
“`
– addを取り消したい
“`
git reset –mixed HEAD
“`
– git resetをなかったことにする
“`
git reset –hard ORIG_HEAD
“`
# reflog
– reflog(参照ログ)とは HEAD やブランチ先端の動きの履歴
各個人のローカルリポジトリに存在
– ブランチの切り替え、新たに加えられた変更のプル、履歴の書き換え、あるいは単なる新規コミットの実行などを記録
git reflog で HEAD の移動履歴を、git reflog <ブランチ名> でそのブランチ先端が指していたコミットの一覧を確認可能
– HEAD@{5}: HEAD の五つ前の状態を示す
“`
$ git reflog
d22bfa

元記事を表示

【初心者向け】Rails開発での注意点

# はじめに
Ruby on Rails チュートリアルでの学習(1ヶ月)を含め、
初めてRailsに触れてから約半年でアプリケーションを開発した結果
色々荒が目立ちすぎだったのでメモとして残しておきます。
指摘は多々ありましたが、クリティカルだと思ったポイントについてピックアップしています。
(なお、自身で気が付くことができずに指摘されたポイントです)

## 自身の来歴(言い訳含む)
工業高校 => 理系大学(情報系)出身。
新卒で就職し、3年程エンジニアとしてJava一辺倒で開発を行う。
過度の残業、過激な追い込みから退職し、病院にお世話になり、
約1年半程、業界無関係のアルバイトでフラフラしてみる。(ブランク)
その後二十代後半で転職し「Ruby on Rails チュートリアル」を1月かけて学習する。
初めてRuby及びRailsに触れてから約半年で社内用に新規アプリケーション開発を実施。

## 開発環境
Windows10 Pro
Hyper-V(Ubuntu 18.04 LTS)
VSCode(Remote–SSHを利用)
Ruby:2.7.3
Rails:6.0.3.

元記事を表示

メソッドを呼び出す時、どんな処理が行われているのか

メソッドを呼び出すとき、どんなことが起きているのか理解するには2つのことを意識しないといけないんです。
➀メソッド探索
➁実際に実行する

それぞれ見ていきましょう
## ➀メソッド探索
メソッド探索とは、その名前の通り、メソッドを探すことです。
それを考える際に、**レシーバ**と**継承チェーン**という言葉が大事です。
例えば“`@books.each“`というコードがあった時、@books がレシーバとなります。呼び出すメソッドが属しているオブジェクトのことをレシーバといいます。
継承チェーンとは親クラスをたどって最終的にBasicObjectクラスまでたどってメソッドがあるかを探すことです。
イメージとしてはこんな感じです
“`
Object
↑superclass
Array
↑superclass
obj → Myclass
“`
objにたいしてメソッドが呼ばれたときにこの矢印の順にメソッドを探していきます。この図にはないですが、最終的にBasicObjectまでメソッドを探していきます。“`Myc

元記事を表示

7つのアクション以外のアクション

オリジナルアプリでグループ共有で使えるカレンダーアプリを作成中。

昨日マイページをルートパスに設定しようとしたところ、パラメーターはルートパスに設定するのは難しいと知り、急遽ルートパスの変更を余儀なくされた。
どんなページに遷移させようか考えた末、グループ登録のページをルートパスにしようと思いついた。

### やりたいこと
まず実装させたいことは、
①グループの新規作成ボタン(sign_in)
②既存グループで自信が未参加のグループへ参加するボタン(sign_up)
③自信が参加中のグループへログインするボタン
以上3点である。

そこで新たに行き詰まったのは、これらのボタンを実装させるためには、どういったアクションがベストなのか、ということ。

まずこのアプリを作る上で意識していることは「シンプルで使いやすいアプリ」である。
ユーザーにはできるだけクリックする回数や入力の手間を省きたいと考えている。
要は③を実装するにあたり、「eachメソッドを使って参加中のグループを一覧として表示させ、グループ名をクリックするだけで、該当ページへ遷移する」といった実装を行いたいわけである。

元記事を表示

Rubyのバージョンを変更した際のLoadError解決法

## 実現したいこと

Rubyのバージョンを変更した際に発生する、LoadErrorを解決したい✅
“`terminal:エラー文(抜粋)
`require’: incompatible library version
“`

## 解決法
結論から言うと、
“`vender/bundle/ruby/バージョン番号“`以下のフォルダを全削除して、“`bundle install“`すれば解決します!!!

## エラー発生→解決まで
その1 rubyのバージョンを変更
“`terminal:terminal
rbenv global バージョン番号
又は、
rbenv local バージョン番号
“`

その2 GemfileのRubyバージョンの書き換え&“`bundle install“`
“`ruby:Gemfile
ruby ‘バージョン番号’
“`

gem を作って公開してみた 〜公開編〜

# 0. はじめに

こちらは前回の [gem を作って公開してみた 〜開発編〜](https://qiita.com/Satoooon/items/36b032a1ea9539244640) の続きの記事になります。
前回までにgemがビルドの実行までできました。今回はそちらのgem を公開する方法を解説していきたいと思います。 

今回も以下のgemをベースにお話しします。

https://rubygems.org/gems/ruby_calendar

# 1. CLIで公開する

[gem を作って公開してみた 〜準備編〜](https://qiita.com/Satoooon/items/a04cc778b0e5ac11ae24#2-gem%E3%81%AE%E9%96%8B%E7%99%BA%E5%85%AC%E9%96%8B%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%82%E3%81%AE) にて用意したRubyGems.orgアカウントがあれば公開できます

## 1-0. credentialsの取得

– CLI上でgem

rspecのスタブで元のメソッドを呼ぶ

# はじめに
先日つまずいた箇所と解決法をメモしています。もっといい方法などもありそうですが、それを見つけた際はまた書き直したいですね。

# TL;DR
元のメソッドを呼びたいときは`and_call_original`メソッドを使う。
“`ruby
allow(hoge_moc).to receive(:say).and_call_original
“`

# 経緯

### 引数で特定の値を受け取った際の動作を定義する
テスト対象のファイルはこんな感じ。
“`ruby:test.rb
class Test
def test_method
hoge = Hoge.new
hoge.say(“hello”)
end
end

class Hoge
def say(message)
message
end
end
“`

テストファイルはこんな感じ。
`Hoge#say`で`”hello”`という文字列を受け取った際に`”hogehoge”`という文字列を返すようスタブする。

“`ruby:test_spec.rb
describe

componentでapplication_helperを読み込みたい

### 状況

Rails6.1から導入された、viewcomponentを使用していたところhoge_component.rbで
application_helperを読み込めず困っていました…?

### 実行環境

ruby 3.0.1p64
Rails 6.1.4.6

### 解決方法
Componentの最初にinclude ApplicationHelperを記述する

“`ruby
class HogeComponent < ViewComponent::Base include ApplicationHelper ... end ``` ### 学び gemや今回のようなapplicationhelperが使用出来ないときは、Helperが読み込めないことがほとんどでした(これで何十時間溶かしてきたことか...?) そういう時は一度include ~~Helperとして見ると解決することが多いです!! エラーが出ると脳死で延々とググってしまう癖があるので、なぜそのエラーが発生しているのかをできるだけ細分化してワンステップごとに解決できるように

【Serializer】カラムの命名は他言語開発者にも配慮しよう

# きっかけ

最近でいちばんなるほどと思ったこと、検索してもあまり出てこない情報だなと感じたのでまとめる。

# 出来事

ActiveModelSerializerでJSONを出力する際、**Rubyの命名規則で**カラム名を書こうとした。
たとえば、ユーザーが自身のアイコン画像があるかのフラグを真偽値で返したいときの命名。

“`ruby
class UserSerializer < ActiveModel::Serializer attributes :id, :name, :registered_avatar def registered_avatar ... end end ``` 最初は```avatar_registered?```と命名しようとしたが、 他のserializerのコードを見ても語尾に```?```をつけた命名をしていなかったので、 何でだろうと思いながらも一応空気を読んで```registered_avatar```と命名してPRを出した。 すると > “`avatar

Rails7で複数画像file_filedを使っていると空画像が入る対策

## 背景

Rails6.1からRails7に上げたとき、画像フィールドの動作がおかしくなったのを修正した備忘録。

RailsアプリはHerokuで動かしており、画像のアップロードにCarrierWaveとCloudinaryを使っている。
development環境では実際にCloudinaryには上げず、手元のローカルファイルとして動作させている。
画像のためにRailsのActiveStorageは使っていない。
また、画像のアップロードは複数画像を使うために`file_filed multiple: true`を使っていた。

## 起こったこと

複数画像を許可している`file_filed`を使って画像をアップロードすると、想定していない空画像が一緒にアップロードされてしまう。

![スクリーンショット 2022-03-08 170300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/025970ce-bd32-bfc9-e356-678334e88785.png)

con

複数テーブルに複数レコードをフォーム1つで保存する

### 環境:

ruby 2.7.3

rails 6.1.4.4

# やりたいこと

form_withとfields_forを使って、関連性のない複数のテーブルに、複数のレコードを、ボタン1クリックで保存する。

![スクリーンショット 2022-03-08 16.01.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496677/ff1a9dbd-e992-83c9-daea-4d9f0010871e.png)

猫のコメントはCatテーブル、犬のコメントはDogテーブルに保存する。さらに、それぞれの種類に対するコメントをボタン1つで一括登録しようというのが今回のお題。

### 全体の流れ

1. 入力ページにアクセスすると、コントローラー側でモデルCatとモデルDogをまとめた擬似モデルのインスタンス(=@formとする)が作成される
2. 擬似モデルのinitializeメソッドが走り、モデルCatに対応するattributesのインスタンス、モデルDogに対応するattribu

【Ruby/Rails】定数の定義と管理方法

# config gemを使う

“`config/settings/development.yml“`などファイルを作成して環境ごとに管理する。

下記のように呼び出して使える。

“`ruby
Settings.SERVICE_NAME
#=> “hoge_app”

Settings[:SERVICE_NAME]
#=> “hoge_app”
“`

# クラス内で定義

文脈としてあるクラスの中だけで使われるような定数はそのクラスに定義する。
“`freeze“`を忘れずに!

“`model/post.rb
class Post < ApplicationRecord ... MAX_COMMENT_COUNT = 100.freeze ... end ``` # 参考 https://github.com/rubyconfig/config https://qiita.com/clbcl226/items/c068f617aa34d552a50a

Cherry本の著者伊藤さんの開発タスクをアサインされたらどういう手順で進めるべきかのアウトプット

# 参考記事
https://qiita.com/jnchito/items/017487cd882091494298

# はじめに
***上の参考記事のアウトプット用にこの記事を書きます。***
上の記事の方が勉強になるのでご了承ください。

# 結論
まず上の記事にこういうフレーズがあります。

>引用 タスクは食べられるサイズに小さく切ってから口に運べ!
アサインされたタスクをそのままほおばると喉に詰まって死ぬぞ!!

***これは大きな問題にいきなり取り組むと何もできないから
まずはタスクを分けて考える***かと思いました。

### 自分がこう思った理由
コードを書けない人が0からコードを書くための3ステップの通り、
いきなりコードを書こうとしても書けないので
***やりたいことを言語化してからコードを書く***ことが大事です。

https://qiita.com/Hashimoto-Noriaki/items/682755f8a51a3f085fb6

順を追って書いて行きます。

# 1.現在の仕様(システムの挙動の確認)
まずアプリケーションがどういう仕組みで動いて

Rails × Vue.jsのSPAでTwitterのOGPを動的に反映させる方法

ご縁箱の実装で上手く情報を掴めず詰まった部分でしたため、
これからSPAで実装する方の役に立つかな?と思い、執筆いたしました。
クローラーについても知っておいた方が理解しやすいと思いましたので予備知識としてまとめています。

※ 間違っている点などございましたら、コメント欄でタコ殴りにしていただけますと幸いです。

## 目標: TwitterのOGP画像を動的に!!
ツイートのURLから出力される画像を切り替えることが出来ます。
Twitterで拡散されたいサービスを作る場合、工夫次第で大いに有効な手段になるかと思います。
![image](https://user-images.githubusercontent.com/78721963/155685673-158df3bc-4f66-4e53-a89a-8c92f5a9579d.png)

ご縁箱もおかげさまでPV数が24,000を突破しまして、
サービス紹介記事のLGTM数も100を”超えそう”です(圧)

https://qiita.com/o83184206/items/dcab2743fea236f0aa67

それはさ

python2 中类似ruby each_slice的实现

“`python
def each_slice(arr, n):
return [arr[i:i + n] for i in range(0, len(arr), n)]

print(each_slice([1, 2, 3, 4, 5], 2))
print(each_slice([1, 2, 3, 4, 5], 3))
print(each_slice([1, 2, 3, 4, 5], 4))
# => [[1, 2], [3, 4], [5]]
# => [[1, 2, 3], [4, 5]]
# => [[1, 2, 3, 4], [5]]
“`

参考:

https://cortyuming.hateblo.jp/entry/2016/07/15/161538

rbenv installコマンドが終わらな過ぎて困った話

# はじめに
1月〜プログラミングスクールで学習しています。
これから平日は~3/25まで毎日何かしらアウトプットのため投稿を続ける予定です。
今回はrbenv installコマンドを用いてRubyのバージョンを指定してインストールしようとした際に、コマンドが終わらなくて困った時のことを書きます。

# 経緯
オリジナルアプリをAWS上にアップするためにEC2(Linux)にSSH接続し、下記インストールコマンドを実行していました。
– rbenv install 2.6.5
ところが数分待っても動きが無く、control+Cで抜けたところよく見るとインストールに少し時間がかかると書いてあったため、再度実行し少し待つことに。。。
そこから15分、20分、、、30分、、、待てども待てども終わりません。。。

“`:ターミナル
[ec2-user@ip-172-31-1-171 ~]$ rbenv install 2.6.5
Downloading ruby-2.6.5.tar.bz2…
-> https://cache.ruby-lang.org/pub/ruby/2.6/rub

Active Record attribute methodまとめ(その①: BeforeTypeCast編)

# はじめに
何かとやってくれるActive Record。その機能を十分に使いこなせていますか?
~~僕は、使いこなせてません!笑~~
今回は、そんなActive Recordのattribute methodのうち、BeforeTypeCastのメソッドについてまとめていきます。
(2022年3月時点。Rails7.0対応。)

# 検証環境
以下のschemaとmodelに基づいて検証を行なっています。

“`
# db/schema.rb
create_table “todos”, charset: “utf8mb4”, force: :cascade do |t|
t.string “title”
t.datetime “schedule_at”
t.integer “status”
t.datetime “created_at”, null: false
t.datetime “updated_at”, null: false

Rubyのevalを使ってみた

## 環境
Ruby 2.6.6

## 発端
開発中に既存コードでこのような感じのCASE文に出会った。

“`ruby
# 定数(商品タイプ)
FOOD = ‘FOOD’
DRINK = ‘DRINK’
OTHER = ‘OTHER’

# 定数(商品タイプラベル)
FOOD_LABEL = ‘食べ物’
DRINK_LABEL = ‘飲み物’
OTHER_LABEL = ‘その他’

def get_label(shouhin_type)
case shouhin_type
when FOOD
FOOD_LABEL
when DRINK
DRINK_LABEL
when OTHER
OTHER_LABEL
else
raise
end
end
“`

要はそれぞれの商品タイプに対応したラベルを取得するために、「商品タイプ名」+「_LABEL」という名前の定数を返したいというメソッド。この状態だと、商品タイプが増えるたびにCASEの分岐をメンテしなければならないし、ただ「_LABEL」をつけるだけなのに何とも回りくどさを感じた。そこでRubyに

sinatra で json を読み込んだ場合のエラー回避

# はじめに
`sinatra`で`json`を読み込んだ際、`undefined method bytesize`が発生しました。

sinatra undefined method bytesize で検索すると、sinatra と json の相性が悪いらしいのですが、`Hash -> json` の話が多いようです。

この記事は、`json -> Hash` 時のエラー回避策です。
# 状況
“`ruby:error.rb
require ‘net/http’
require ‘uri’
require ‘json’

def read_uri(url)
uri = URI.parse(url)
res = Net::HTTP.get(uri)

json_data = JSON.parse(res)
“`
最後の行で`undefined method bytesize`が発生。
# 対策
“`diff_ruby:success.rb
def read_uri(url)
uri = URI.parse(url)
res = Net::HTTP