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

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

[paiza][ruby] マップの判定・縦横 (paizaランク B 相当)を整理する

### はじめに
paizaでアルゴリズムを学習し始めて日が浅いです
ランクBになると途端にコードが長くなり混乱中です
Aランクアップメニュー > マップの判定・縦横 (paizaランク B 相当)の回答に対して理解を深めたいと考え記事にしています
⚠シェア可能な問題集の問題です
⚠リファクタリングとかはせず愚直に与えられた回答を使用しています

また、問題をご存知な方前提になっていますので入力例・出力例は載せていません

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_map_boss

### 回答

“`ruby
h, w = gets.split.map(&:to_i)
board = h.times.map { gets.split(”) }

board.each.with_index do |row, y|
row.each_index do |x|
flag_row = false
flag_clm = false

if x == 0

元記事を表示

【Rails】Rubocopのアップデートとrubocop-rails_configの導入

## はじめに
未経験からエンジニアに転職して、3ヶ月ほど経つエンジニアです。
業務にあたりながらも、小規模なアプリを作って楽しんでいます。

今回はRubocopのアップデートで学んだことを残しておこうと思い、記事を書きます。

## rubocop-rails_config の導入
https://github.com/toshimaru/rubocop-rails_config

こちらがrubocop-rails_configというgemです。

> 「何かしらRuboCop設定のレールが欲しいよね〜」というところで閃き、「だったらrailsチームの用意した公式rubocop.ymlを使えばいいじゃない」ということで冒頭のRailsとほぼ同じ設定を持ったrubocop-rails gemを作りました。(https://blog.toshimaru.net/rubocop-rails/)

このgemを使用することで↓の設定とほぼ同じrubocop.ymlファイルが作れるというものです!

https://github.com/rails/rails/blob/main/.rub

元記事を表示

Ruby で「カラオケマシン問題」を解いてみた

Rubの学習を初めて3週間あまりのプログラミング初心者です。
[「カラオケマシン問題」](https://blog.jnito.com/entry/2014/06/06/104420)にチャレンジしてみました。

“`ruby
class KaraokeMachine

@@scale = %w[C C# D D# E F F# G G# A A# B] #

def initialize(melody)
@melody = melody
end

def transpose(key)

result = Array.new
# melody に渡された文字列を(\w#?) で区切り配列とすることで#に対応
str_array = @melody.split(/(\w#?)/)
str_array.each do |str|
# scaleの要素とindex番号を変数に入れる
@@scale.each.with_index do |value, index|

元記事を表示

[ruby] each_with_index, each.index_with, each_indexの違い

### はじめに
paizaで出てきたメソッドの違いをまとめました

[参考にさせていただきました!](https://udemy.benesse.co.jp/development/system/ruby-each-with-index.html)

### 結論
“`ruby
.each_with_index
通常のeach + 0からカウントするindexを得る
.each.with_index
動きは上と同じ
.each_index
要素分+1 indexを得る
“`

#### each_with_indexとeach.with_indexの違い
`each_with_index`はindexが0からスタートする
`each.with_index(1)`と引数を渡すと(0ではなく)1番目から始められるため`i+1`とやる必要がなくなる

### 使い方
“`ruby
array = [“a”, “b”]

array.each_with_index do |a, i|
puts “「#{i} #{a}」”
end
#=> 結果
# 「0 a」
#

元記事を表示

form_withがlocal: trueなのにviewが再描画されずにはまった件

viewで`form_with`メソッドを利用してログインフォームを作ったが、`local: true`にしているにも拘らず、`render ‘new’`でログインフォームを再描画できずにはまったのでメモ。

# TL;DR
Rails 7では、form_withに対して`local: true`の代わりにオプションで`data: { turbo: false }`と指定する。

# 環境
“`bash
$ ruby -v
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-linux]
$ rails -v
Rails 7.0.3
“`
“`ruby:routes.rb
Rails.application.routes.draw do

get ‘/login’, to: ‘sessions#new’
post ‘/login’, to: ‘sessions#create’

end
“`

# 説明
以下ログインフォームのviewとセッション用のcontroller。

“`erb:ne

元記事を表示

【Rails】Railsのform_withでリセットボタンを設定

## はじめに
Rails の`form_with`を使用して検索フォームを実装するにあたり、リセットボタンの実装方法について調べました。

HTMLでは`input`タグで`type=”reset”`を指定すれば簡単にリセットボタンを作成できます。
“`html


“`
`form_with`でも`type属性`に`reset`を設定できるのでしょうか。

## 使用環境
– Ruby 2.7
– Rails 6.1
– Bootstrap 4.0

## type=”reset”を生成するヘルパーはなさそう
`form_with`では様々なフォーム要素を生成するヘルパーメソッドがあります。
(例)
“`erb
<%= form.text_field :title %>
<%= form.check_box :pet_dog %>
<%= form.radio_button :age, "child" %>
<%= form.text_area :message,

元記事を表示

AとBの日付の差分がn日以上ある場合、エラーになるValidationを作る。

## 概要
AとBの日付の差がn日以上ある場合、
エラーになるようValidationを作成する。

例:AとBの日付の差が10日以上ある場合、エラーになる。

 例1:
  A(4/1)
  B(4/16)
  →15日差分がある。
   →エラー。

 例2:
  A(12/30)
  B(12/21)
  →9日差分がある。
   →OK

## 日付の差分を求める
下記の書き方で日付の差分を求めてみた。

“`rb
hogehoge_on = “2022/04/01”.to_date
piyopiyo_on = “2022/04/08”.to_date

# hogehoge_on からpiyopiyo_onまでの日付の差
(hogehoge_on – piyopiyo_on).to_i.abs
# => 7

# ※to_iを入れないとよくわからない結果が出力される。
(piyopiyo_on – hogehoge_on)
# => 7/1

“`
参考:

Rubyで日時を扱うDateTimeを完全理解!計算・タイムゾーンの指定方法も解説

https:

元記事を表示

<%= render @boards %>

部分テンプレートを呼び出す際に使用される。部分テンプレートとは“`_board.html.erb“`などのことで、この部分テンプレートを繰り返し表示される際にはcollectionを使用する。

例えば

“`_board.html.erb
<%= board.title% >
<%= board.body% >
“`
この部分テンプレートをcollectionを使用せずに書くと
“`index.html.erb
<% @boards.each do |board| %>
<%= render 'board', board: board %>
<% end %>
“`
eachを使い繰り返し呼び出している。

collectionを使用し書くと
“`index.html.erb
<%= render partial: 'board', collection: @boards %>
“`
collectionに@boardを渡して、内部要素を1つ1つ取り出している。意味的にはにはeach文とほぼ同じように見えるが、まとめて部分テンプレート呼び出すためパフォーマンスが良

元記事を表示

Before Rails Tutorial1章 Paizaでの環境構築

## はじめに

## [対象者]
+ Ruby HTML CSSをある程度理解しているが、Rails Tutorial で挫折した。
+ **不安なので誰かの解説を受けながら一緒に作りたい。**
+ **「Railsで試しにアプリケーションを作りたいが、何も思いつかない」**

## [前提知識]
全ての知識が必要ではありませんが、Railsの前に学習しておくことを推奨します。
Railsの学習をはじめた初学者が陥る問題として、Rails以外の関連知識が不足しているため
挫折するといったケースが多く見受けられます。

未学習の方は Progate の下記コースを奨めています。

#### 学習済であることが推奨される
**【HTML&CSS】 基礎(入門書や [Progate HTML & CSS](https://prog-8.com/courses/html))レベル**
**【Ruby】 基礎(入門書や [Progate](https://prog-8.com/courses/ruby))レベル**
**【データベース】 基礎 (https://products.sint.c

元記事を表示

【Ruby】意外と知らない!?標準入力から値を受け取る方法

## 標準入力?
### 標準入力とは
標準入力はプログラムに値を渡す入力元のこと、標準出力はプログラムから出力される値の出力先のことをいいます。 標準入力の仕組みを使うと、キーボードやファイルなど外部から値(データ)をプログラムに与えることができる。

### 前提条件
前提として使用言語は、Rubyになることを予めお伝えしておきます。
そしてPaizaにて標準入力があったため、メモを含めて記事にします。

## 1行に1要素だけの場合
“`
//標準入力
Tokyo

line = gets
p line

//出力結果
“Tokyo”
“`

## 1行に複数要素があった場合
“`
//標準入力
Tokyo Osaka Kyoto

line = gets.split(‘ ‘)
p line

//出力結果
[“Tokyo”, “Osaka”, “Kyoto”]
“`

※splitはsplit(”)のシングルクォート内の文字で文字列を分解する。
例えば、Tokyoという文字をそれぞれ一文字ずつ取得したければ、シングルクォートの中に何も入れずにすると下記のように取得でき

元記事を表示

【Ruby】意外と初心者は知らない?頻出メソッド

## Rubyでの頻出メソッドをまとめてみた
### 入力メソッド
“`
//入力値:文字列
input = gets

//入力値:文字列
input = gets.chomp

//入力値:数値
input = gets.to_i

//入力値:数値
input = gets.chomp.to_i
“`

上記は文字列および数字を入力する際のメソッドである。
それぞれ二つずつ書いているが、その違いは**改行があるかないか**の違いである。
**chomp**をつけることによって改行がなくなる。

### 配列メソッド
“`
//入力値(数値)を配列に格納 
input = gets.split.map(&:to_i)

//分割して配列に格納
a,b,c = gets.split(” “).map &:to_i

//入力値を順番に格納
a = readlines.map &:to_i
“`
gets.split.map(&:to_i)は**スペース区切りで数値が並んでいる入力**ができる。
たまにsplit(“”)と引数に区切り文字の半角スペースを指定している人を見かけ

元記事を表示

【Rails】コメント機能をAjax実装① 準備編

コメント機能を実装したので、記録を残します___φ(•ᴗ•๑)
間違っている箇所があれば、ご指摘頂けると大変助かります。

実装内容

・投稿記事に対してコメント機能をつける
・ログインユーザーのみコメント可能
・投稿・削除・更新を非同期で実装する

前提
—–
・Rails6
・Devise導入済
・jQuery導入済
・Bootstrap5
・記事投稿機能を実装済

準備

#### (1)Commentモデルを作成

Commentモデルに、user_idとpost_idを忘れずに追加します。
“`
rails g model Comment body:text user_id:integer post_id:integer
rails g db:migrate
“`

モデルにアソシエーションとバリデーションを追加します。
“`ruby
class Comment < ApplicationRecord belongs_to :user belongs_to :post validates :body, presence: true

元記事を表示

DockerでRails6の環境構築

# 前置き
DockerやGitなどはインストール、初期設定済みのものとします
新規にアプリを作成するときに毎度調べるのも面倒なので備忘録として

### 環境
– MacOS Monterey(cpu intel)
– Docker -v 20.10.16
– docker-compose v2.3.3
### 構築内容
– Rails6
– DB postgresql

# 手順
– 必要なディレクトリとフォルダを用意
Docments下に作成するアプリのディレクトリを作り、移動
“`
$ mkdir myapp
$ cd myapp
“`
必要なフォルダを作成
“`
$ touch Dockerfile Gemfile Gemfile.lock docker-compose.yml entrypoint.sh
“`
dockerfileに記述
“`
FROM ruby:2.7.4

## nodejsとyarnはwebpackをインストールする際に必要
# yarnパッケージ管理ツールをインストール
RUN curl -sS https://dl.yarnpkg.co

元記事を表示

session”メソッド”って本当にメソッドなの?

# はじめに

session **”メソッド”** って言うけど、使われ方が全然メソッドっぽくない。

sessionメソッドは以下のようにして使われる。

“`ruby
session[:user_name] = user.name
“`
まるでハッシュのようだ。

しかも

“`ruby
session.class
=> ActionDispatch::Request::Session
“`

というふうにあたかもsessionというオブジェクトに対して`class`メソッドが使えているように見える。

果たして本当にsessionはメソッドなのだろうか?

## 先に結論

メソッドである。

コントローラー内でbyebug↓

“`ruby
(byebug) defined? session
#=> “method”
“`

続けてsessionとだけ打ってみる。

“`ruby
(byebug) session
#

元記事を表示

public private protected の違いをあらためて

# はじめに
Rubyのアクセス修飾子(メソッドの呼び出し制限の識別子)について、学習を開始してすぐに調べたことがあったのですが、その時の曖昧な理解のまま現在に至っていたので、機会があったのであらためて調べてみました。その結果、わかったことをまとめます。

# 定義をRubyリファレンスマニュアルで確認
> メソッドは public、private、protected の三通りの呼び出し制限を持ちます。
> – public に設定されたメソッドは制限なしに呼び出せます。
> – private に設定されたメソッドは関数形式でしか呼び出せません。 ただし self.foo のように self. と書かれている場合は呼び出すことができます。
> – protected に設定されたメソッドは、そのメソッドを持つオブジェクトが selfであるコンテキスト(メソッド定義式やinstance_eval)でのみ呼び出せ ます。

引用:[クラス/メソッドの定義](https://docs.ruby-lang.org/ja/latest/doc/spec=2fdef.html#singleton

元記事を表示

【Rails】orderメソッドが効かないとき

1対多のアソシエーションの場合の並び替えで躓いたのでメモφ(´・ω・`)メモメモ

今回は、記事に対するコメントを新着順で並び替えです。

まず、新着順にするために下記のように、
コントローラーにorder(created_at: :desc)を追記しました。
しかし、並び替えされず・・・

“`ruby
# app/controllers/post_controller.rb

def show
#~~省略~~
@comment = Comment.new
@comments = @post.comments.order(created_at: :desc)
end
“`

解決方法
—-

**1) postモデルに-> { order(created_at: :desc) }を追加**
※dependent: :destroyの前に置くとエラーになりました。
“`ruby
# app/models/post.rb

class Post < ApplicationRecord belongs_to :user has_many :comments

元記事を表示

【paiza】【Ruby】paizaの標準入力について、入力値を可変させてデバッグする方法

paizaの解答欄では標準入力が一つしか与えられず、説明文の中で下記のように記載されていましたが、入力値を変える方法が分からず苦労したので、まとめてみました。
_「複数の与えられる入力でテスト致しますので、 サンプル入力だけでなく入力値を可変させてデバッグしていただく事をお勧めいたします。」_

かなり基礎的なところでしたが、私はVSCodeで回答とinputファイルをそれぞれ作成した上でファイルをリダイレクトして標準入力したところ、上手くいきました。
(リダイレクトは、rubyというよりはlinux?)

~~~ruby:example.rb
N = gets.to_i
ans = []
N.times do
ans << gets.chomp.split.map(&:to_i) end print ans ~~~ ~~~input.txt 4 13 12 11 12 1 1 4 4 ~~~ ~~~ターミナル $ ruby example.rb < input.txt ~~~ 【参考】 https://www.kenschool.jp/blog/?p=1143 初学者のた

元記事を表示

【Rails】【通報機能】ユーザー通報機能を作ってみました

ポートフォリオを作っていた際にwebアプリケーションでよく見かけるユーザー通報機能を実装したいと思い、実装の仕組みを検索してみたのですがほとんどヒントを見つけられませんでした。
なので、自己流でユーザー通報機能を実装してみました。まだまだ初心者のため、諸々間違いがあるかもしれませんが、この記事が少しでも皆さんの助けになると幸いです。(何かお気づきのことがあればコメントお願いいたします> <) ### 【環境】 - Rails 6.1.5.1 - ruby 2.6.3 ### 【前提】 - 管理者機能(Admin)を実装しています! - deviseを使っています! ### 【実現したいこと】 - 自分以外のユーザーを通報できる機能。 - 通報されたユーザーを管理者が確認できる。 - その通報のステータス(対応済み等)を更新できる。 - 管理者の判断でユーザーを退会扱いとする事ができる。そのユーザーはログインできなくなる。 ### 【テーブル設計】 | User | Report | | ---- | ---- | | name | reporter_id | | em

元記事を表示

複合テストコードのまとめ

## はじめに
初心者なりにまとめたものになりますので、諸先輩方からは何書いてんだおめえと感じる部分があると思います。
そう感じた際は、お手数ですが、コメント頂けると幸いです。

内容は、自分がテストコードを書く際に使用した物の構成になります。

## 目次
– visit
– expect

– マッチャ(matcher)とは
-include
-eq
-have_content
-have_no_content
-have_selector
-have_link
-change

– find().click
– find().hover
– fill_in

## visit
リクエストを送り、指定されたページへ遷移するためのコード
下のように記述することで、prefixにルーティングされているpathのビュー先へ遷移する

visit tweets_path
visit 「prefixのパス」_path

## expect
「アプリの実際の挙動」と「製作者が想定している挙動」が一致するかどうかを判断する記述
マッチャ(matcher)と呼ばれる検証する条件

元記事を表示

【Rails】指定日の投稿数を非同期通信化にて表示!

##### ★先駆者様の記事を見ながら真似して実装してみました!↗︎
皆さんもぜひ参考にして下さい(^。^)σ

https://qiita.com/nao0725/items/3ce5512500b38ea75431

なんですが、、、
真似しても中々実装できず、とても苦労したので、復習も兼ねてまとめてみます。
語彙力、コミュ力なしの期待値なし人材が書くので、耳にポテチ挟みながら見て下さいm(_ _)m

#### 〜完成イメージ〜
何も入力してない時は、「年/月/日」が入る!
![スクリーンショット 2022-06-26 18.50.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2717077/e1e05359-1605-0955-fd51-545579e1d521.png)
日付指定後、検索ボタンを押すと、すると、、、
検索結果(投降数OTZ)が一瞬で出てくる(非同期通信すげぇ!!!)
![スクリーンショット 2022-06-26 18.50.13.png](https://qiita-im

元記事を表示

OTHERカテゴリの最新記事