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

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

【個人開発】自分だけのうまくいく方法を見つける目標達成サービス「b-logic」をリリースしました。

# はじめに
突然ですが、目標を立てて達成できたことありますか?
筆者は`英語を喋れるようになる`や`筋肉ムキムキになる`といった目標を人生の中で幾度となく立ててきました。
ほとんど3日坊主で続きません。
なんどもなんども自分はなんて意志力のない人間なんだと嘆きました。
しかし本当にそうでしょうか?
実はやり方がまずいだけなのではないでしょうか?自分だけのうまくいく方法があるはずです。
そう、プログラムのように今まではエラーが起きていて、実は正しいプログラムではなかったのです。
正しいプログラムさえ、正しいやり方さえ見つければどんな目標だって達成できるはず
このような思いから、目標達成を条件ベースで考えていく目標達成サービスを作りました。
# サービス概要
ユーザーは`目標`、`課題`、`タスク`といった3つ観点から目標を計画をします。
達成できない目標はいつだって、具体的な行動が欠けていたり、ひとそれぞれ集中できる環境、タイミングが存在します。(家だと集中できないけど図書館なら集中できるとか)
自分だけのうまくいく方法をサービスを使いながら、見つけていきユーザーへ目標達成を促します。

元記事を表示

Ruby|csv_box を使ってもっと楽に CSV をつくりたい

# やりたいこと

CSV 出力は案件ごとに手製で作ることが多いと思います。業務で関わるサービスだと列数も多く、並び替えや条件による列の追加・削除でバグが起きやすいですよね。

問題はデータ部の出力と列の並びが直結しているので、それを分けてやると管理しやすいと考えました 🙂

“`ruby
require ‘csv’

Book = Struct.new(:id, :title, :price)
books = [Book.new(1, ‘How to cook delicious meals’, 1500), Book.new(2, ’10 tips to lose weight’, 250)]

table = CSV::Table.new([])

headers = [
‘id’,
‘title’,

‘price’
]

# メンテナが代わることによる無理な列名の追加…
headers << 'tax price' if .... books.each do |book| # ヘッダ部をみながらデータ部の並びを整えるのが大変...

元記事を表示

[Rails]モーダルウィンドウを作る

# はじめに
本記事では、過去に作った`モーダルウィンドウ`の作り方を記述します。

## イメージ
このような形です。
かっこいいですよね。

![1a72749226abfeb518fca661092f8b69.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1768158/407aa99b-82e0-0699-7373-95ebbc9ccfc9.gif)

# コード
該当のビュー

“`erb

省略

省略

<%# モーダルウィンドウ %>

初心者がGemについて解釈する!

初めて聞いた時、何のことかさっぱりわからなかったです。。。

そもそもGemとは?初心者なりにわかりやすく噛み砕いていこうと思います!

# Gemとは?

結論は、GemはRubyのライブラリと言うことです!
RubyGemsにはたくさんのライブラリがあり、それぞれをGemと呼ぶ。

# ライブラリとは?

結論は、他のプログラムと組み合わせて使用する為に、複雑なプログラムを1つのセットにしたもの!
プログラミングにおける拡張機能は、ライブラリと呼ばれ、複雑な機能実装でも、ライブラリをアプリへ読み込ませることにより、簡単に実装できるようになる!と言うことですね!

# まとめ

わかりやすく言うと、良いパーツを使って簡単に実装していくって事だと思います!
言語化して説明するの本当に難しいです汗
間違っていたりしたら、遠慮なくご指導してください(; ;)
とりあえず慣れるまで、今後もこんな感じで描いていこうと思います。。

kaminari gemってorderの位置で取得順変わるの?

RubyやRailsのページネーションの実装でよく使われるkaminari gem。
レビュワーから「orderの指定位置で中身の順番変わる可能性ある?」と指摘を受けて検証してみたので
その結果のメモです。

どういうことかというと、次の2つって実行結果同じなの?という話。

“`ruby
Hoge.order(‘created_at ASC’).page(0)  #1
Hoge.page(0).order(‘created_at ASC’)  #2
“`

1の方は、Hogeをcreated_atで昇順で並び替えた後に1ページ目の件数分を取得?
2の方は、Hogeから1ページ目の件数分を取得した後に並び替える?

ということは1と2で結果が同じになることは保証されないのでは?

という話。

## 結論
同じでした!

## 検証してみる
コンソールで実行し、流れているSQLを確認します。

### 1:先にorderするパターン
![スクリーンショット 2021-09-13 23.24.23.png](https://qiita-image-store.s3.ap-northe

<%= form_with do |f| %> updateやcreateが発火/動作しない問題

#<%= form_with do |f| %> updateやcreateが発火しない問題
コントロールやモデルに問題があるコードがないのに発火/動作しない…
updateやcreateができない原因は使っているタグ、ビューファイル(html.erb)に問題があるかも

“`java:タグ

いっぱいあるけど割愛

“`

##うまく動作しない集
“`java:form

#bootstrapで参考しがちなformタグ..これをform_withと併用するとうまく発火しない原因になる。
<%= form_with model:@user, local:true do |f| %>
<%= f.label :profile_image %>
<%= attachment_image_tag @user, :profile_image, :fill, 30, 30, fallback: "noimage.png"%>
<%= f.submit %>#submitボタンを押して画面がrenderみたい

2部グラフの判定の練習:BFS・DFS・Union-Find

[2部グラフ](https://en.wikipedia.org/wiki/Bipartite_graph)の判定をきちんとやったことが無かったので練習することにした。

また、通常のグラフ探索の方法で気になる点があり、[Union-Find](https://en.wikipedia.org/wiki/Disjoint-set_data_structure)の要領で解決できそうだったので、これも試してみた。

## グラフ探索
2部グラフの判定をするには、グラフの頂点に2値(例えば `0` と `1` )を振ってみて、矛盾が生じるか調査する。「辺で繋がった2頂点は逆の値」という規則があるため、適当な頂点に値を決め打ちしたら隣接する頂点を貪欲に埋めていけばいい(探索順序は問わない)。隣接する頂点に既に値が振ってあれば、それが期待通りかどうか検査する。

1セットの探索(例えば下記コードの `bfs()` 1回の呼び出し)では開始地点と連結な頂点しか調べられないので、未調査の頂点を探して何セットか探索する。

### 幅優先探索(BFS)
開始地点から近い順に頂点を埋めていくパターン。

【Rails】gemのアンインストールは、慎重に。

###1.背景
Rubyを使用して個人開発を行っています。
使用を検討していたgem(ActiveRecord)をインストールしたものの結局使わなかったのでアンインストールしたところ、
別プロジェクトのデータベースが消えてしまい、**「慎重にやっておけば良かった…」**と思いました。

今回はその反省を備忘録としてまとめます。

###2.環境
– mac.os バージョン10.15.6
– Ruby 2.7.3
– Rails 6.1.3.1
– psql (PostgreSQL) 12.6

###3.アンインストールを実行
下記のコマンドを実行し、Gemfileからも削除、`bundle install`を行いました。

“`ruby
project_name % bundle exec gem uninstall ActiveRecord
“`
その結果、無事削除することができました。しかし、別プロジェクト(RubyとRuby on Rails使用)のデータベースが削除されてエラーになりました。
データベースを作成し直した話はこちら(作成中)

####補足:bundl

view内でif文を用いた条件分岐のスマートな書き方[Ruby, Rails]

## はじめに

今回の記事はとても局所的なテーマを扱います

Rubyの構文において、以下のようなif文を用いた冗長的な書き方を、よりスマートにまとめます

`app/views/announcement.html.erb`

“`html:Before

配信元 <% if @announcement.user_id %>
<%= @announcement.user.name %>
<% else %>
管理者
<% end %>

“`

## 結論

三項演算子を用いて、かつ文字列の部分はStringオブジェクトにします

“`html:After

配信元 <%= @announcement.user_id ? @announcement.user.name : "管理者" %>

“`

## 想定状況

announcementインスタンスはuserインスタンスに紐づく、もしくは紐づいていない、状況です

“`ruby:app/models/user.rb
class User

【Rails】bulletを使ってN + 1問題解決

#N + 1問題とは

N+1問題とは、データベースからデータを取り出す際に、大量のSQLが発行されてパフォーマンスが低下してしまう問題のことです。以前にN + 1問題について配信してありますので気になった方はご参照ください。

https://qiita.com/kinoshitaken123/items/fb67f7de37c2ff4f0ba2

#bulletとは

N + 1問題がどこに発生しているかお知らせしてくれるgemです。

https://github.com/flyerhzm/bullet

>公式のドキュメント

#導入方法

以下のコードをGemfileに追記。

“`gem:Gemfile
group :development do
gem ‘bullet’
end
“`

“`
$ bundle install
“`

#デフォルト設定

“`ruby:config/environments/development.rb
Rails.application.configure do
# ここから
config.after_initial

エラー:Routing Error_Uninitialized constant HomesControllerにつまづいた話

Ruby on Rails ver.5.2.5にて通販サイトの作成をするにあたり、namespaceとscope moduleの使い分けができておらず発生したエラー。
初心者ゆえの初歩的なミスですが、備忘録として記しておきます。

■エラー内容
devise にて管理者側と顧客側を定義し、namespaceによりcontrollerをそれぞれ[controllers/admin]と[controllers/public]に棲み分けて作成しました。
そしてrutes.erbを以下のように記載

![スクリーンショット 2021-09-13 20.34.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2019141/99da92bd-ce8b-107d-1397-74b61a022598.png)

各controllerにアクション名を定義し、いざサーバー起こしてページ確認しようと思ったら、、

Routing Error
Uninitialized Constant HomeController

【Rails6 コメント機能でよくある問題の解決方法】

#実装内容
`以前に投稿したコメント機能実装の記事`では、お伝えできなかったコメント機能で**起こりうる問題点**とその**解決方法**をまとめてみました。

https://qiita.com/taddy_korokoro/items/4d75e33ceb5c7a5124a8

https://qiita.com/taddy_korokoro/items/6faf37702dccb2c7ca32

#解決する問題一覧
– 改行問題
– 半英数字の連続文字によるはみ出し問題

##改行問題(プレビュー)

###before
[![Image from Gyazo](https://i.gyazo.com/8ae6430be65f90358be48e9ad3e067fb.gif)](https://gyazo.com/8ae6430be65f90358be48e9ad3e067fb)

###after
[![Image from Gyazo](https://i.gyazo.com/3f6216e2401e140443700bead78c5169.gif)](https://gyaz

[Ruby] AtCoder 過去問 B – Collatz Problem

##はじめに
AtCoder過去問B問題をRubyで解いてみました。
他の方々の解き方を見ていると自分の解き方をしている人は見かけなかったので考え方少し変なのかなと思いながら、ACいただいているからいっかと思ったりしています。

それではよろしくお願いします。
問題はこちらから確認してください。↓

https://atcoder.jp/contests/abc116/tasks/abc116_b

##B – Collatz Problem

まずは入力を受け取ります、今回はシンプルですね。
integerで受け取ります。

“`ruby
s = gets.to_i
“`

aを配列で管理します。
入力値が初期値となるので配列aに入れておきます。

“`ruby
s = gets.to_i

a = [s]
“`

問題文に従って条件分岐をして、配列aに追加するif文を作ります。

“`ruby
s = gets.to_i

a = [s]

if s % 2 == 0
s = s/2
a << s else s = 3*s +1 a << s end

rails g kaminari:views bootstrap4でNo such file or directoryのエラー解決方法

## 実装したいこと
* ある記事を参考に“gem ‘kaminari’“を導入してページネーション機能を作ろうとしておりました。

* gemの導入後に、“% docker-compose run web rails g kaminari:views bootstrap4“コマンドを実行したところタイトルのようなエラーが発生したので解決に至るプロセスをまとめようと思います。

## エラー内容

>% docker-compose run web rails g kaminari:views bootstrap4

“`ruby
% docker-compose run web bundle exec rails g kaminari:views bootstrap4
Creating locat_web_run … done
Running via Spring preloader in process 29
/usr/local/bundle/gems/kaminari-core-1.2.1/lib/generators/kaminari/views_generat

Ruby会議2021 レポート

こんにちは!最近rubyを書き始めたHiraです!
今回は、Ruby会議2021に参加してきたので紹介したいと思います!
ほとんど、自分のメモ用なので、実際の内容に関して知りたい方は、公式のYoutubeがアップロードされていたので、そちらからご確認ください!
https://www.youtube.com/channel/UCBSg5zH-VFJ42BGQFk4VH2A

イベントのタイムスケジュールとセッション

https://rubykaigi.org/2021-takeout/schedule#day1

## セッション
すべてを見ることはできなかったので、個人的に気になったトピック

### TypeProf for IDE: Enrich Dev-Experience without Annotations

IDEによる、静的型付けがメインのお話

– ruby3

退会したユーザーの表示を変える

現在投稿系のアプリを作っていて退会したユーザーの扱いどうしようかなーと考えていたら、teratailなどのサービスで「退会済みユーザー」のような表記になっているのを見受けました

直感的に見てもわかりやすいし実装もしやすそうだなと思ったのでこれで行こうと思います。

実装

まず退会機能なんですが、完全にデータを削除といったことはせずに退会したことにするといった
__論理削除__といった状態にするといいといろんな記事に書いてありました。

論理削除の概要については下記記事がわかりやすかったので参考させていただきました

https://qiita.com/wanko5296/items/f1af9c7bf020e867c2dd

情報提供を依頼されたりするときにすぐに出せるようにするみたいなこともあるみたいですね。
誹謗中傷とか犯罪予告とか

まあ僕の場合は投稿系なので100件投稿してくださったユーザーが退会した時にそれを全部削除するってなったら中身がスカスカになりそうだと思ったんで退会した場合はユーザーネームを
__退会済みユーザー__みたいな表記に変えてコメントや投

RubyKaigi Takeout 2021参加したYO

はいどうもー!Ruby on RailsエンジニアYOです。
先日RubyKaigi Takeout 2021に参加したので、個人的に面白いセッション、感想も含めてメモりたいです。
個人向けのメモ程度の内容ですので、イベント自体に興味ある方は公式のYoutubeアーカイプ~~待ちましょうね。~~見てね:

コロナの状況がまだ落ち着いていないので、今年のRubyKaigiもTakeout形式での主催になります。サイトはこちらです:
https://rubykaigi.org/2021-takeout

## (個人的に)面白かったセッション

イベントのタイムスケジュールとセッション表:

https://rubykaigi.org/2021-takeout/schedule#day1

**以下一日目のセッション**

### TypeProf for IDE: Enrich Dev-Experience without Annotatio

日本語でエラー文章

gemを入れる

“`ruby:GEM
gem ‘rails-i18n’
“`

“`ターミナル
bundle install
“`

config/application.rbに追記

“`config/application.rb
module Stoma
class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 5.2 config.i18n.default_locale = :ja ここ追加する # Settings in config/environments/* take precedence over those specified here. # Application configuration can go into files in config/initializ

【Ruby on Rails】退会機能をgemなしで実装する方法

#対象者

* 退会機能を実装予定の方

#目的

* 退会機能を実装して退会後、ログイン出来ないようにする

#実際の手順と実例
###1.deviseの導入

User認証で新規登録とログインを行うためにdeviseを導入します

https://qiita.com/nao0725/items/83c73c417be01913a857

“`Gemfile.
gem ‘devise’
“`

““Terminal.
$ bundle install
$ rails g devise:install
$ rails g devise user name:string is_valid:boolean #①
$ rails g devise:views
““

①で退会したかどうかを判断するカラムを作成しています。
booleanは真偽のどちらの値なのかを決めるデータ型です。

Rubyでbooleanの判定を行う方法を現役エンジニアが解説【初心者向け】

boolean型はデフォルト値を設定する必要があるので、マイグレーションファイルを編集します。

“`db/mi

トランザクションとは。

# はじめに
本記事では、トランザクションについて記述しました。
トランザクションとはなんですか?
と聞かれた際に、私は何も答えることができませんでした。
悔しかったので調べました。

# トランザクションとは
`レコードの更新を行う複数の処理を1つにまとめて行うこと`を指します。

トランザクションを利用することにより、
「処理の一部は成功し、一部は失敗した」という事象は発生せず、
`すべての処理の成功または失敗のみの状態`を作ることができます。

### Railsではこのような利用

“`ruby
ActiveRecord::Base.transaction do
処理1
処理2
処理3

end
“`
ここに処理1、処理2…を1つのまとまりとして記述することで、
処理が1つでも失敗すれば、全体としての処理は失敗ということになります。

# トランザクションのACIDプロパティー
以下を参照しています。
トランザクションは、銀行のATMに例えることが多いみたいです。
かなりわかりやすいので勝手にオススメです。
[トランザクションの ACID プロパテ