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

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

Parsletでかんたんな自作言語のパーサを書いた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234055/9ebeab7b-e274-4b72-4c9a-1a69b3c3c2c9.png)

<自作言語処理系の説明用テンプレ>

自分がコンパイラ実装に入門するために作った素朴なトイ言語とその処理系です。簡単に概要を書くと下記のような感じ。

– リポジトリ: [github.com/sonota88/vm2gol-v2](https://github.com/sonota88/vm2gol-v2)
– 小規模: コンパイラ部分は 1,000 行程度
– pure Ruby / 標準ライブラリ以外への依存なし
– 独自VM向けにコンパイルす

元記事を表示

【Rails】マイグレーションファイル関連のコマンドまとめ

##はじめに
マイグレーションファイル関連のコマンドのまとめです。

##migrationを実行

“`
$ rails db:migrate
“`
##データベースを作成

“`
$ rails db:create
“`
##データベースを削除

“`
rails db:drop
“`

##migrationの実行、データベース作成、削除をまとめて行う

“`
$ rails db:reset
“`

##migrationを削除
削除する際にはまず、ステータスを確認。

“`
$ rails db:migrate:status
“`
ステータスの部分がdownになっていれば削除。
upになっている場合、downにする。

“`
$ rails db:rollback  ・・・ 一つ前をdownにする
$ rails db:rollback STEP=○ ・・・ ○個前までdownする
$ rails db:migrate:down VERSION=20211101101010  ・・・ ファイルを指定してdownする
“`
最後の「2021110110

元記事を表示

エラー文について①!

#①.結論!

Webアプリケーション開発中は、エラーが頻繁に起きます!

エラー解決を重ねていくことで、Railsの全体像や仕組みの理解が深まるといっても過言ではありません!

エラー解決のために必要な前提知識を理解して、様々なエラーについて学びたいと思います!

#②.No template for interactive request

今回のエラーは、投稿ボタンを押したらNo template for interactive requestというエラーが表示されるというものです!

タイトルを確認すると、「No template」となっています。これは、ビューファイルが見つからないというエラーです!

No templateのエラーが出ているため、「〇〇〇.html.erbのファイルがおかしいのでは?」という仮説がたてられます!

仮説をもとに、例として、app/views/〇〇/new.html.erbを確認すると、nwe.html.erbとなっており綴りが間違っていることが確認できます!

正しく、new.html.erbと修正して解決できます!

#③.まとめ

エラー

元記事を表示

Couldn’t find Schedule without an IDを解決する

rails初学者です。現在、オリジナルアプリを作成中で、削除機能をつけようとした時に、
Couldn’t find Schedule without an IDという「IDがありませんよ!」 というエラーが出ました。

まず最初にbinding.pryで

“`ruby:schedules_controller
binding.pry
schedules = Schedule.find(params[:id])
schedules.destroy
“`
paramsの中身を確認したところ、
pramsにはidではなく、formatが代入されていました。

そこで、routes.rbを確認すると

“`ruby:routes.rb
resources :posts do
resource :schedules, only: [:update, :edit, :destroy]
end
“`
とschedulesのresourceが単数系になっていて、このままではIDを付与してくれないので、resourcesの複数形に直し、

“`ruby:index.htm

元記事を表示

【RubySilver対策】Ruby特化のクイズサービスを作りました。

#はじめに

ポートフォリオとしてRubyの問題を提供するクイズアプリ**『RubyMania』**をリリースしました。
資格勉強でなくてもご利用頂けるかと思います。

https://www.rubymania.info

私自身プログラミング未経験ではございますが、学習を始めて5ヶ月くらいの頃にRubyを体系的に学んでみたいと思ったのがきっかけでRubySilverとRubyGoldを取得させて頂きました。  

RubySilverとRubyGoldを取った時の話はまたどこかで記事に出来ればと思います!

当時資格を勉強していて感じた事としては、
①知ってるメソッドが一つ増えると読めるコードが増えるので勉強が楽しい
②初学者が資格取るとモチベーション上がってもっと頑張ろうって思える
③でも資格教本の問題やネットにある問題をやり尽くしてしまってこれ以上どうして良いか分からない
④しかも答えと問題を暗記してしまってこれ以上どうして良いか分からない

そんな楽しさの共有と悩みを持つ方の一助となれたら嬉しいなと思ってこのサービスを作りました。

難易度としては
①Progateで

元記事を表示

[Rails]has_oneやbelongs_toをリロード!削除されたときの挙動がreload_associationとreloadで違うので注意!

ActiveRecordのアソシエーションは1度取得するとキャッシュしてくれるため、2度目からはSQLが発行されません。
この機能はとても便利なのですが、たまに最新の情報にリロードしたいときがあります。

例えば下記のようにuser.profile.addressが別で更新された場合です。

“`irb
irb(main):001:0> user = User.first

# profileは初回アクセスなので、SQLが発行される
irb(main):003:0> user.profile.address
Profile Load (0.9ms) SELECT `profiles`.* FROM `profiles` WHERE `profiles`.`user_id` = 2 LIMIT 1
=> “住所だよ”

# profileはキャッシュしているのでSQLは発行されない
irb(main):004:0> user.profile.address
=> “住所だよ”

# 別プロセスでprofile.addressを更新
irb(main):005:0> Profile

元記事を表示

【Ruby silver】三項演算子が入れ子になっていて難しかった話(三項演算子、論理演算子、和集合、積集合を使ったコード)

#以下のコード実行後の正しい表示結果を選べ。
“`
a = [1, 2, 3, 5, 8]
b = [1, 3, 6, 7, 8]
c = false || true ? true && false ? a | b : a & b : b ;
p c
“`
#解
“`
=>[1, 3, 8]
“`

#私の知っている三項演算子と様子が違う
頭の中にハテナが飛び散った。
つまづいた点として“「条件式A ? 条件式B ? 式C : 式D : 式E」“の構造になっていたこと。
通常のチェリー本等で見ていた三項演算子はこうだった。
“「条件式 A ? 式 B : 式 C」“
この式は2重構造になっていた。

###結論から言うとこの式はこうゆうことだった。

“`ruby
if false || true #=>true
if true && false #=>false
a | b
else
a & b
end
b
end
“`
①“if false || true“ #=>trueが返るので次のifに進む
②“if true &&

元記事を表示

Ruby on Railsのscaffoldを使ってみる

##はじめに
Ruby on Railsのscaffoldを使ってみました。
今までは勉強のために一つ一つ記述していたのですが、一度も使ってなかったのでお試しです。

###scaffoldとは
調べてみると、今まで一つ一つ記述していたモデル、コントローラー、ビュー、ルーティングを自動的に作成してくれるみたいですね。
すごく手間が省かれますね。めっちゃ便利!!

###使ってみた
まずはコマンドです。今回はモデル名は「Post」で作成します。

“`
$ rails g scaffold Post カラム名 データ型
“`

“`
            invoke active_record
create db/migrate/20211031145458_create_posts.rb
create app/models/post.rb
invoke test_unit
create test/models/post_test.rb
create test/fixtures/

元記事を表示

【422 Unprocessable Entity 】のバリデーションエラー、外部キー制約が原因でした。

コードを書いてテストを実行したら**「422 Unprocessable Entity」**というエラーが出ました。
ググってみたらバリデーションエラーみたいです。
そして、自分の場合は外部キー制約の書き方に問題がありました。

### 環境
– Ruby 2.6.3
– Ruby on Rails 6.0.1

#結果
:::note
modelの外部キー制約のチェックを任意にしてあげる。
:::

#前提
利用者(User)が車を1台持っていたり**持っていなかったりする**状況でした。

“`ruby
class User < ActiveRecord::Base has_one :car end class Car < ActiveRecord::Base belongs_to :user # ↑ここが違っていた。 end ``` この状況だとCarモデルに`user_id`がセットされていないとバリデーションエラーが発生します。 そのため、利用者が車を持っていない場合に422エラーが発生していました。 #解決 `optional: true`を追加して

元記事を表示

WEBRickでWebサーバを立ち上げて同一LAN内のパソコンからアクセスする

## 動機
フレームワーク無しでもWEBRickで簡単にWebサーバが作れるというのを読んで、面白そうだったので手元で試してみます。以下、忘れないようにするための記録です。

## WEBRickでWebサーバーを立ち上げる(まずはローカル専用)
WEBRickについて詳しいことはこちらを見つつ。

https://docs.ruby-lang.org/ja/latest/library/webrick.html

↑これを見ると、
> WEBrick は Ruby 3.0 で標準ライブラリから削除されました。Ruby 3.0 以降で WEBrick を使いたい場合は rubygems から利用してください。

とのことなので、gem installしておきます。

“`zsh
$ gem install webrick
“`

次に、適当なディレクトリを作ってファイルを作成します。

“`server.rb
require ‘webrick’
options = { BindAddress: ‘127.0.0.1’, Port: ‘10080’, DocumentRoot: ‘

元記事を表示

Selenium + ChromeDriver + Ruby によるスクレイピング環境を Docker で構築する。

# はじめに
Docker コンテナを定期実行する形で Selenium によるスクレイピングをしたいことがあったのでその時のメモ書き。

# Dockerfile
Selenium を動かすにはブラウザ(Chrome)とブラウザのドライバー(ChromeDriver)が必要なのでインストールします。

~~~Dockerfile
# 執筆時点での最新
FROM ruby:3.0.2

# Chrome をインストール
RUN wget -q -O – https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add \
&& echo ‘deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main’ | tee /etc/apt/sources.list.d/google-chrome.list \
&& apt-get update -qq \
&& apt-get install -y google-chrome-stable

元記事を表示

【Ruby silver】&, &&, |, ||演算子それぞれを使ったコードについて考える

次のコードを実行するとどうなりますか

“`ruby
a = [1, 2, 5, 7, 8]
b = [1, 3, 6, 7, 9]
c = nil || a & b | a && a | b
p c
“`
演算子の優先順位とそれぞれの演算子について理解していないと解けない問題。

—-

###積集合「&」

重複している要素は取り除かれ、共通する要素を取り出す。

“`ruby
a = [1, 2, 3]
b = [1, 3, 5]
a & b #=> [1, 3]
“`

###&&演算子

&&は a と b がどちらも真のとき、最後に評価された b を出力する

“`ruby
a && b #=> [1, 3, 5]
“`

###和集合「|」

重複している要素は取り除かれ、重複している要素をまとめて出力する。

“`ruby
a = [1, 2, 3]
b = [1, 3, 5]
a | b #=> [1, 2, 3, 5]
“`

###||演算子

||は a と b がどちらかが真のとき、最初に評価された a を出力する

“`ruby

元記事を表示

putsメソッド、printメソッド、pメソッドの違い

| メソッド | 出力後の改行 | メソッド自体の戻り値 | 改行文字を含めた場合 | 配列を出力した場合 | 呼び出すメソッド |
| —- | —- | —- | —- | —- | —- |
| puts |改行を加えて出力する。|nil|改行される|配列の[]を含まず各要素ごとに改行される|to_s |
|print|改行を加えない。|nil|改行される|配列の[]を含め改行なし|to_s|
|p|改行を加えて出力する。|ただし文字列を出力するとその文字列がダブルクオートで囲まれる。|引数のオブジェクトそのものが改行されずに/nのまま表示される|配列の[]を含め改行なし|inspect|

“putsメソッド“と“printメソッド“は内部的に引数で渡されたオブジェクトに対して“to_sメソッド“を呼び出して**文字列に変換**している。

“pメソッド“は“to_sメソッド“ではなく“inspectメソッド“を呼び出す。
文字列が出力後にダブルクオート付きになっていた理由として**内部的にStringクラスのinspectメソ

元記事を表示

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

#はじめに
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章(本記事)

#事前準備
Gemfileにテストデータ作成用のFactory Botを追加

“`rb:Gemfile
group :development, :test do
gem “factory_bot_rails”
end

元記事を表示

【Ruby silver】範囲式 フリップフロップ演算子

次のコードを実行するとどうなりますか。 

“`
10.times{|d| print d == 3..d == 5 ? “T” : “F” }
“`

解説文

d == 3..d == 5の部分は条件式に範囲式を記述しています。
この式は、フリップフロップ回路のように一時的に真偽を保持するような挙動をとります。
詳細は、Rubyリファレンスに詳しい説明がありますのでそちらを参照してください。

  • https://docs.ruby-lang.org/ja/latest/class/Range.html
  • 初めて見た時に混乱しました。
    どうゆう順番で評価するか整理して考える必要があったのでまとめます。

    **⑴Rangeの復習**

    “`ruby
    # ..の場合
    a = (1..5).to_a
    => [1, 2, 3, 4, 5]

    # …の場合
    a = (1…5).to_a
    => [1, 2, 3, 4]
    “`
    ?
    ..の場合は5を含む1〜5の範囲になる。
    …の場合は4.9999…までは対象になるが5は範囲に

    元記事を表示

    Progate Ruby on Rails5 VI ~ VII 個人的ざっくりまとめ

    # emailの重複がないかチェック

    バリデーションで`uniqueness: true`を指定

    “`rb:models/user.rb
    class User < ApplicationRecord validates :email, {uniqueness: true} end ``` # マイグレーションファイルのみ作成 データベースに変更を加えるが、モデルは必要ないとき `rails g migration ファイル名`をターミナルに入力 ```terminal:ターミナル $ rails g migration add_image_name_to_users ``` # マイグレーションファイルの仕組み テーブルの変更を加えるには、マイグレーションファイルのchangeメソッドの中に処理をかく ```rb:20170427053118_add_image_name_to_users.rb class AddImageNameToUsers < ActiveRecord::Migration[5.0] def change # 変更内容 e

    元記事を表示

    【コードリーディング】Rails 1.0 ActiveRecordのソースコードを読んでみた

    #はじめに
    Railsポートフォリオ作成でActiveRecordを使っており、作成当時は正直内部処理がどうなっているのか分かっていませんでし、気にもしていませんでした笑

    そういった中、実務案件で直接SQLを書く機会があり、ActiveRecordって実際どういう風にSQLに置換して実行しているのか気になりはじめました。

    そこで、ActiveRecordのソースコードでSQLに置き換えている仕組みの部分のコードを読んで理解した部分を書き留めたいと思います。

    #今回読んだソースコード
    今回はコードの流れをシンプルに見たかったので最新のソースコードではなくRails v1.0.0のソースコードを読みました。とは言ってもコードは約1800行もあり、読むのになかなか骨が折れました笑

    その中でもController部分でよく使用するfindメソッドに絞って読んだものを記載します。
    ソースコード元は[こちら](https://github.com/rails/rails/blob/v1.0.0/activerecord/lib/active_record/base.rb#L378)

    #そ

    元記事を表示

    【Ruby】条件分岐 備忘録

    #目的
    条件分岐 備忘録

    #結論
    とりあえず3種類あった。
    if文
    unless文
    case文

    “`ruby:timesメソッド #if文
    a = 10
    b = 20
    if a > b
    puts “aはbより大きくない”
    elsif a < b puts "aはbよりも小さい" end =>aはbより大きくない
    “`

    “`ruby:timesメソッド #unless文
    a = 10
    b = 20
    unless a > b
      puts “aはbより大きくない”
    end
    =>aはbより大きくない
    “`

    “`ruby:timesメソッド #case文
    array = [ “a”, 1, nil ]
    array.each do |item|
    case item
    when String
    puts “item is a String”
    when Numeric
    puts “item is a Numeric”
    else
    puts “item is something”
    end
    end
    =>item is a String

    元記事を表示

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

    #はじめに
    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章(本記事)

    #Minitest

    ###ユーザー登録に対するテスト

    “`rb:test/integration/users_signup_test.rb
    require ‘test_helper’

    class UsersSignupTest < ActionDispatch::IntegrationTest test "invalid signup info

    元記事を表示

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

    #はじめに
    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章(本記事)
    – [第7章](https://qiita.com/supyolo888/items/d2824ced26402b5f58d1)

    #Minitest

    ###Userテスト

    “`rb:test/models/user_test.rb
    require ‘test_helper’

    class UserTest < ActiveSupport::TestCase def setup @user = User.new(name: "Example User", email:

    元記事を表示

    OTHERカテゴリの最新記事