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

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

Ruby を Crystal にトランスパイル してAtCoder に登録したら解くべき精選過去問 10 問を解いてみた

# はじめに
Atcoderのコンテストにて、Rubyで`TLE`が解消しないこと、ないでしょうか。
私はあります。
`Ruby`のコードを速い言語に`トランスパイル`して欲しいと思ったこと、ないでしょうか。
**私はあります。**

https://qiita.com/superrino130/items/8e2040ccd6971f61c0cf

前回記事にて`ripper`の内容が少し理解できましたので、それを`crystal`に応用してみました。

但し、`julializer`は`Ripper.sexp`を使用、こちらは`Ripper.lex`を使用しています。

また、諸先輩の記事を参照させていただきました。

https://qiita.com/tomerun/items/23ce2a2ed6ead291d222

https://qiita.com/universato/items/8a6c311b4db5615fc50a
# Crystallizer
“`rb:crystallizer
require ‘ripper’

module Crystallizer

元記事を表示

expectation構文

# アウトプット
expectation(エクスペクテーション)とは、
テスト検証で得られた挙動が想定通りなのかを確認する構文。
雛形の基本構造は下記の通り

“`ruby
expect(検証で得られた実際の挙動).to matcher(想定した挙動)
“`
# 学んだこと
単体テストコード・結合テストコードや、
検証する機能の種類によって、
expectの引数や、matcherの種類が変わる。
たが今まで使用したものは、基本構造を応用したものであった。

元記事を表示

【Rails5】Warning: ReactDOM.render is no longer supported in React 18.

# 1.はじめに
– [「現場で使える Ruby on Rails 5速習実践ガイド」](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227)を読み進めて、Reactを導入しようとした。
– 開発環境は、次のとおり。
“`Ruby:terminal
$ ruby -v
ruby 2.6.9p207 (2021-11-24 revision 67954) [x86_64-darwin19]
$ rails -v
Rails 5.2.7
“`
# 2.はまったこと
– Reactを導入して、試したところ、ブラウザに“`hello“`が表示されない。
– ChromeのディベロッパーツールでConsole画面を確認したところ、次

元記事を表示

プロジェクトのgem, 端末にインストールされるgem,どっちを使うか指定する方法

## gemとは?
2つの意味があります。
1. **Rubyのライブラリ** のことです。詳細は[こちら。](https://www.ruby-lang.org/ja/libraries/)
1. **gemを管理するパッケージ管理ツール**の名前

ただ、gemというツールでパッケージを管理すると、依存関係で問題が発生することがあります。
そこでBundlerが登場します。

## bundlerとは?
依存関係を考慮してgemを管理してくれるパッケージ管理ツールです。
https://bundler.io

## Gemのインストール方法は大きく2種類

1. 端末全体で使えるタイプ(globalインストール)
mac,windows内のどこでも使えるようになる。
1. プロジェクト(特定の階層)でのみ使えるタイプ(localインストール)
作っているアプリの中で使えるようになる。

# 結論

### `bundle exec`をつける = ローカルインストールのgemが呼ばれる
例)
“`
bundle exec rails g controller users

元記事を表示

【Rails5】No route matches [GET] “/loginout”

# 1. はじめに
– [「現場で使える Ruby on Rails 5速習実践ガイド」](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227)を進めています。
– 開発環境については、次のとおりです。
“`
$ ruby -v
ruby 2.6.9p207 (2021-11-24 revision 67954) [x86_64-darwin19]
$ rails -v
Rails 5.2.7
“`
“`Ruby:Gemfile
gem ‘turbolinks’, ‘~> 2.5.3’
“`
# 2. はまったこと
– 一覧画面からログアウトしようとしたところ、“`No route matches [GET] “/log

元記事を表示

webrickでproxyを作ったときレスポンスのbodyが文字列として取り出せない

ちょっと悩んだのでメモ。

あるWebアプリがどんなパラメータの受け渡しをしてるのか覗いてやろうと思って WEBrick::HTTPProxyServer でプロキシサーバを作りました。その時レスポンスのボディ (WEBrick::HTTPResponse オブジェクト) がなんか Proc オブジェクトになってたので中身が覗けません…。で、こういうふうにやれば覗けましたというメモです。

だめな例
“`ruby
s = WEBrick::HTTPProxyServer.new(
Port: 8080,
ProxyContentHandler: ->(_req, res) {
puts res.body # ここが問題。これじゃ覗けない
})
Signal.trap(‘INT’) do
s.shutdown
end
s.start
“`
だめな例では `#

元記事を表示

【Rails エラー】 NameError (uninitialized constant クラス名)

Rails cで、Rails: NameError (uninitialized constant クラス名)のエラーに遭遇。

以下を試したところエラーが消えました。

“`
$ exit #rails cから一旦出る
$ spring stop
$ rails c #もう一度、rails c
“`

元記事を表示

RailsでHerokuに初期データが反映されなくてハマってました

# はじめに
seeds.rbを本番環境に反映させようとしたがうまくいかずに困ってました。
無事にherokuに反映することができたので、メモ用に投稿します。
## 自分の環境
* Rails 6.0.3
* Ruby 2.6.3
* AWS Cloud9
## 前提
seeds.rb作成済み
## 初期データの投入方法
### ローカルの設定を完了させる
“`
$ rails db:migrate:reset
$ rails db:seed
“`
### gitにプッシュする
“`
$ git add -A
$ git commit -m “メッセージ”
$ git push
$ git push heroku
“`
### Herokuのデータベースをリセットする
“`
$ heroku pg:reset DATABASE
“`
### herokuでマイグレーションを実行する
“`
$ heroku run rails db:migrate
“`
### seedデータを投入
“`
$ heroku run rails db:seed
“`
これで初期データの

元記事を表示

【Ruby】def hoge=(fuga) という書き方

# 本題
Qiita や企業の技術ブログを見ていて,`def hoge=(fuga)` という書き方がありました.

“`ruby
def authors_attributes=(attributes)
@person_attributes = Person.new(attributes)
end
“`

`hoge=` で一つのメソッド名を表しています.
値の設定専用のメソッド(つまりセッター)ということを表すために,よく使われる書き方みたいです!知りませんでした!

# 参考記事
https://teratail.com/questions/248629

下の記事では,セッターの関数名に`hoge=` という書き方が使われています.

https://qiita.com/k-penguin-sato/items/5b75be386be4c55e3abf

元記事を表示

ログイン直後の処理を設定する

### 結論
**ログイン後に処理を追加する時はwardenのコールバックを使う。**

“`
Warden::Manager.after_set_user do |user,auth,opts|
auth.cookies.permanent[‘cookie名’] = ‘cookie値’
end
“`
(ここではログインしたらcookieに値をセットしたい場合の処理を例にしている。)

**wardenのafter_set_userコールバックの使い方**
https://nekorails.hatenablog.com/entry/2018/10/27/172832#:~:text=warden%27%5D.logout(%3Aadmin)-,callback,-callback%E3%81%A8%E3%81%AF

コールバック内で、ログインをしたユーザに対して処理をしたい場合はブロックで渡している「user」を使う。

**注意**
ここで注意なのは、userをdeviseのcurrent_user感覚で使わないこと。

こういう時にエラーになる↓
ログインに使うクラスが

元記事を表示

ロガーもどきを作る時のコツ

“`sample.rb
def put_log(message)
puts “#{`hostname`.chomp}:#{caller.first}:#{message}”
end

def method_a
put_log(‘メッセージ’)
end

method_a
“`

実行結果

“`
LAPTOP-5EMLK46H:sample.rb:6:in `method_a’:メッセージ
“`

`LAPTOP-5EMLK46H` は私のノートPCのマシン名。

どのマシンでのどのプログラムのどのメソッドでの出来事なのかというのが大事。

元記事を表示

deviseに自動的に設けられているバリデーション

# アウトプット
deviseを用いて、ユーザー情報を管理するモデル(Userモデル)を作成すると、
下記の通りになる。

##### app/models/user.rb
“`ruby
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable end ``` 5行目の`:validatable`という記述が、 deviseにより自動的に設けられているバリデーションを指している。 バリデーションは下記の通りである。 ###### email - 存在すること - 一意性であること - @を含むこと ###### pa

元記事を表示

【Ruby】dry-validationでバリる

# 概要
Validationを良い感じにやってくれるgemを現在使っているため備忘録として記事を書いていく。
ここでは特に`dry-validation`と`dry-strcut`を解説!

# 使うまでの流れ
## 1.Gemをインストール

“`bash
$ gem install dry-validation
$ gem install dry-struct
“`

## 2.基底クラスを作成

“`ruby
class ApplicationContract < Dry::Validation::Contract config.messages.default_locale = :ja # デフォルトメッセージを日本語に変換 config.messages.backend = :yaml config.messages.load_paths << 'config/contract/error.yaml' # 任意のエラーメッセージを書くロケールファイルのpath EMAIL = /.@./ # メールバリデーション用 PHONE_NUMBER = /

元記事を表示

駆け出しエンジニアのCI改善(その2 GithubActionsでテスト実行)

## 自己紹介: 駆け出しエンジニア
はじめまして。
私はRailsで自社サービスのWeb開発を行っている駆け出しエンジニアです。
この度はGithubActionsによる自動テストの作成を担当しました。

2020年 11月|エンジニアとしての学習を開始
:—:|—
**2021年 5月**|**エンジニアへ転職**
**2022年 2月**|**テスト自動化** :tada:
2022年 4月|現在(11ヶ月)

現時点で動くものを作ることができましたので、これからさらに磨きをかけて行きます。
より良い方法、至らない点については優しく指摘頂ければ幸いです。

### 実行環境: Ruby3.0&Rail6.0
Ruby|3.0.3
—|—
**Rails**|**6.0.4.6**

## 目標:GithubActionsでテストを並列実行する
最終的な目標はRspecのテストをGithubActionsで並列で実行することです。
4つのステップに分けて進めて行きます。

1. [テスト用DB作成の為にseed.rbを作成する](https://qiita.com/

元記事を表示

Rails ActiveStorageを使って画像を投稿する方法

この記事は私の学習の保存用のために書いている記事になります。新しく学んだ内容をアウトプットして残していき充実した学習をしていきたいと思います。
説明の不足や間違っている情報などがあればご指摘いただけると幸いです。よろしくお願いします。

## そもそもActiveStorageとは?

Railsで画像の投稿や表示を行うもので画像は通常のカラムとして保存できないため特別な保存方法が必要となり、それを行うのがActiveStorageです。

## ActiveStorageをインストールする

以下のコマンドでActiveStorageをインストールする

“`
$ rails active_storage:install
“`
インストールが終わるとマイグレーションファイルが自動で追加される。マイグレーションファイルをmigrateするために以下のコマンドを入力
“`
$ rails db:migrate
“`
以上がマイグレーションファイルができたときの基本の流れで、カラムを追加する必要があれば追加してから「rails db:migrate」を行う。

## モデルに記述を

元記事を表示

listen (LoadError)

# はじめに
AWSのリモート上でpumaを起動させた所、エラーが出た時ので備忘録として書かせて頂きます。

# 環境
ruby 3.0.2
rails 6.1.4
puma 5.4

# エラー
![スクリーンショット 2022-04-07 19.41.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594478/32c6c251-4644-d3dc-8d3e-a1f76ad32ede.png)
LoadErrorだったので、listenのファイルを確認したところ、ファイルがあったので、listenのgemがないのかと思いGemfileを確認した所あるのに何故エラーが出るのだろう?

# gem listenとは
ファイルの変更、追加、削除を検出するものみたいです。

# 原因
Gemfileをよく見てみると…:bulb:
![スクリーンショット 2022-04-08 11.38.18.png](https://qiita-image-store.s3.ap-northeast-1.amaz

元記事を表示

ユーザー新規登録機能に画像登録も追加する方法【Ruby on Rails】

まずは完成イメージから。
こんな感じで、新規ユーザー登録画面でユーザーアイコン用の画像も設定出来る仕様を実装してみます。 ちなみに、画像の登録は面倒だし、取りあえす画像は設定しないといった場合にはデフォルトで画像が自動で設定される仕様になっています。

![スクリーンショット 2022-04-08 9.54.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2316171/ffb3997b-dfca-e89e-b108-abd87b01cb7b.png)

## コントローラーで、createアクションの設定

“`:app/controllers/users_controller.rb
def create
@user = User.new(user_params)
image = params[:user][:user_image] ← この行を追加
hash = SecureRandom.hex(10) ← この行を追加
@user.user_imag

元記事を表示

NameError (uninitialized constant Sidekiq::Logging)

– [「現場で使える Ruby on Rails 5速習実践ガイド」](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227)の「Chapter7-8 非同期処理や定期実行を行う(Jobスケジューリング)」を進めていたところ、“`sidekiq“`の実行でハマってしまいました。
# 1.開発環境
“`Ruby:terminal
$ ruby -v
ruby 2.6.9p207 (2021-11-24 revision 67954) [x86_64-darwin19]
$ rails -v
Rails 5.2.7
“`

# 2.はまったこと
“`bundle exec sidekiq“`を実行したところ、次のようなエラー

元記事を表示

Rails コメント機能を非同期通信(Ajax)を用いて実装したい!

## はじめに
プログラミング初学者の自分用アウトプットです。
誤った知識や記述があれば教えていただけると幸いです。

## 開発環境
– ruby2.6.3
– rails6.1.4

## 前提条件
本を投稿するWebアプリを作成中
– ユーザー機能実装済(Userモデル(device導入))
– 投稿機能実装済(Bookモデル)
– コメント機能実装済(BookCommentモデル)

## やりたいこと
– ユーザーがコメントを投稿した際に、ページをリロードせずにコメントの投稿ができる。
– ユーザーがコメントを削除した際に、ページをリロードせずにコメントの削除ができる。

###### コメント機能を使用した際に、ページを部分的に更新できるようにしたい!
## 実装の流れ
#### ●jQueryを導入
“`ruby:Gemfile
gem ‘jquery-rails’
“`
“`ruby:javascript/packs/application.js
import “jquery”;
“`
“`
$ bundle install
“`
#### ●view

元記事を表示

Rails 7.0.2にアップグレード後、SQLインジェクションの危険性のあるクエリがエラーになった

# エラー内容

エラー内容は以下。

“`text
ActiveRecord: :UnknownAttributeReference: Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s): “field(id, ?)”.This method should not be called with user-provided values, such as request parameters or model attributes. Known-safe values can be passed by wrapping them in Arel.sql().
“`

要は、「field(id, ?)はSQLインジェクションの危険があるから、危険じゃないことを確認できてるならArel.sql()で囲め」とのこと。

エラー出た部分のコードは以下の様な感じ。

“`ruby
User.where(id: ids).order

元記事を表示

OTHERカテゴリの最新記事