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

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

【個人開発】全国の無料キャンプ場を検索し、欲しい情報を一目見て得られるようなサービスを作りました。

## はじめに
みなさんキャンプはお好きですか?キャンプで焚き火を囲んでいるだけでも心が浄化されますよね。焚き火には「1/f ゆらぎ」と呼ばれる成分が含まれていて化学的にその癒し効果が証明されているそうです。焚き火をしながら「1/f ゆらぎ」の声を持つ宇多田ヒカルの曲を聴き、好きなビールでも飲めば大抵の嫌なことなんて忘れてしまいます。僕は焚き火をするのに無料キャンプ場をよく利用しています。コスパ最強の無料キャンプ場を多くの人に知ってもらいたいと思い、このサービスを作りました。

## サービス概要
CAMPHOOD -無料キャンプ場をもっと身近に利用しよう-
URL: https://www.camphood.net
![camphood-logo-yama.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1153603/384bdbad-122a-a683-ab77-678bcb2ba7c2.png)

キャンプに行く前はとにかく情報収集が大事です。僕はいつも下記のようなことをざっと調べていましたが、ま

元記事を表示

DM、チャットにおける通知機能

## 参考記事
1.[RailsでややこしいDM機能を1万字でくわしく解説してみた](https://qiita.com/bindingpry/items/6790c91f374acc25bea2)
2.[【Rails】通知機能を誰でも実装できるように解説する【いいね、コメント、フォロー】](https://qiita.com/nekojoker/items/80448944ec9aaae48d0a)
3. [[Rails] 同じmodelを参照する外部キーを一つのmodelでもつ方法
](https://qiita.com/takeoverjp/items/bb56d6a8eae191cd3732)

## 前提
・DM機能(テーブル設計に関しては参考記事1と全く同じ)
## Roadmap
・モデルの作成
・モデルのリレーション
・通知機能の作成
・モデルに切り出し
・読んだ際に既読になる機能の作成

## モデルの作成
“`
$ rails g model Notification
“`
“`migration_file.rb
class CreateNotificatio

元記事を表示

ActiveAdmin のメニュー設定をすごく便利にする ActiveAdmin::MenuTree のご紹介

ActiveAdminのメニュー設定を便利にする [ActiveAdmin::MenuTree](https://rubygems.org/gems/activeadmin-menu_tree) というgemを作ったのでご紹介します。

### ActiveAdminとは

https://activeadmin.info/

https://github.com/activeadmin/activeadmin

ActiveAdminとは、Railsで管理画面をさくっと作れるフレームワークですね。とても便利です。

元記事を表示

【Rails】繰り返し処理におけるインデックスについて

#each do 文におけるインデックス

“`hoge.html.erb
<% @hoges.each_with_index do |hoge, i| %>

元記事を表示

Ruby on Rails チュートリアル第14章をやってみて & まとめ

#ユーザーをフォローする
■第14章
他のユーザーをフォロしたりフォロー解除したり、フォローしているユーザーの投稿をステータスフィードに表示する機能を追加する。

ここで学んだデータモデルは、今後自分用のWebアプリケーションを開発するときに必ず役に立つらしいので、理解できるよう頑張ります。。

##14.1 Relationshipモデル
`has_many`を使えば実現できるようなものではない。問題は生じてしまう。
それを解決するために`has_many through`について説明する。

###14.1.1 データモデルの問題 (および解決策)
いい加減なモデルを作ってしまうと、とにかく面倒で悲惨なことになる。
データの関係についてしっかり考えて作成する。

userとuserを繋ぐテーブルactive_relationshipsを作成する。
マイグレーション生成。

“`
$ rails generate model Relationship follower_id:integer followed_id:integer
“`

このリレーションシップは今後`follow

元記事を表示

Synology DS218J Redmine立ち上げ(DOCKER)

SynologyのNASのバージョンUPすると、パッケージマネージャからRedmineが消えてしまいました。

# DOCKER-COMPOSEの立ち上げ

“`docker-compose.yml

version: ‘3.8’
services:
redmine:
image: redmine
container_name: redmine
ports:
– 8080:3000
volumes:
– ./data/plugins:/usr/src/redmine/plugins
– ./data/themes:/usr/src/redmine/public/themes
environment:
REDMINE_DB_MYSQL: redmine-db
REDMINE_DB_PASSWORD: redmine
depends_on:
– redmine-db
restart: always

redmine-db:
image:

元記事を表示

Ruby on Rails チュートリアル第13章をやってみて

#ユーザーのマイクロポスト
■第13章
Twitterのミニクローンを完成させる。

##13.1 Micropostモデル
Micropostリソースの最も本質的な部分を表現するMicropostモデルを作成する。

###13.1.1 基本的なモデル
まずはMicropostモデルを生成。

“`
rails generate model Micropost content:text user:references
“`

`ApplicationRecord`を継承したモデルが作られる。そして、`belongs_to`のコードも自動的に追加されている。
理由は、`user:references`という引数も含めていたため。

自動生成されたMicropostモデル。

“`rb:micropost.rb
class Micropost < ApplicationRecord belongs_to :user end ``` `User`モデルとの最大の違いはreferences型を利用している点。 これを利用すると、自動的にインデックスと外部キー参照つきの`user

元記事を表示

ActiveModel::MissingAttributeError: can’t write unknown attribute “ に悩まされた【Rails】

RailsのAPIを一から作っている時に遭遇しました。ググっても全然引っかからないし「もぅマヂ無理。。。リスカしょ。。。」ってなってました。ですが結構基本的なところでポカしてました。

結論から言えば,`primary_key: true`を書き忘れていただけだったのですが。なぜこれでエラーが出たのか考えてみます。

# Railsでprimary_keyのカラムを変える手順

https://guides.rubyonrails.org/active_record_migrations.html#creating-a-table

Railsでprimary_keyを変更する手順は、以下の通りです。

1. `create_table`メソッドに、`id: false`を渡す
1. `create_table`メソッドのブロックに、`primary_key: true`を渡したフィールドを作る

もし`primary_key`自体いらねえよって時は,`create_table`に`id: false`を渡すだけで`primary_key`自体作らなくなります。

お手本は、
“`

元記事を表示

class<

ruby書いているとタイトルのような記述を見たことがある人は多いとおもいます。自分はよくわからなかったので今回の記事でまとめてみようとおもいます。

こういう時はとりあえず公式ドキュメントを見てみようと思ったので見てみました。すると、
>特異クラス方式。複数のメソッドを一度に定義するとき向き
>https://docs.ruby-lang.org/ja/3.0/doc/spec=2fdef.html#class_method

## 特異メソッドとは?
特異メソッドとは1つのオブジェクトに対して適用されるメソッドのことです。実際に例を見ていきましょう

“`
class User
def my_name
puts “自己紹介しましょう”
end
end

ouki = User.new
riboku = User.new

def ouki.introduction
p “秦国最強の将軍である”
end

ouki.my_name
=> 自己紹介しましょう

riboku.my_name
=> 自己紹介しましょう

ouki.introduction
=> “

元記事を表示

【RSpec】raise_error, changeマッチャーを繋げて使いたい

## 例外を投げることを確認しつつ、値が変化することも確認したい

下記のようなクラスがあった時に、
`StandardError`を投げることと、`@num`の値が増えることを確認したい。

“`ruby:テスト対象のクラス
class TestTarget
attr_reader :num

def initialize
@num = 0
end

def call!
@num += 1
raise StandardError
end
end
“`

## 繋げない書き方

`raise_error`マッチャーで期待値を確認する**前後の行**で、値の変化を確認するとこうなる。

“`ruby
RSpec.describe ‘TestTarget#call!’ do
it ‘例外を投げ、@numの値が増える’ do
t = TestTarget.new

# expect { t.call! }.to change(t, :num).by(1) のように書きたいけど、
# 例外が発生するから確認できない

元記事を表示

N+1問題の直感的理解

#N+1問題
例えば、user(has_many :posts)なるテーブルと、post(belongs_to :user)なるテーブルの二つがあるとする。
userは0個以上のpostを持っていて、postには各userのid(user_id)が必ず対応している。
ここで、各userの持っているpostを取り出し、userの名前(user.name)と、postのタイトル(post.content)を全件表示したいとき、どのようなコードを書けばよいだろうか。

最も分かりやすいのは以下のコードだろう。

“`ruby:view
User.all.each do |user|
user.posts.each do |post|
puts “#{user.name} / #{post.title}”
end
end
“`
このコードで実行される内容は、

1. userの情報を取得するために、userテーブルにアクセス
2. id = 1のuserのpostの情報を取得するためにpostテーブルにアクセス
3. id = 2のuserのpostの情報を取得するためにp

元記事を表示

request.env[“HTTP_USER_AGENT”] について

request.env[“HTTP_USER_AGENT”] というのを実務で見かけてよくわからなかったのでまとめてみようとおもいます。

## 何ができるのか?
結論からいうと、これを使うことでどのブラウザからアクセスしているのか、どのデバイスからアクセスしているのかということがわかるんです。
例えば、
“`
request.env[“HTTP_USER_AGENT”].include? “Chrome”
“`
とすることでユーザーがchromeを使ってアクセスしているのか、ということがわかるんです。
また、
“`
request.env[“HTTP_USER_AGENT”].include? (‘Mobile’)
“`
とすることで、アクセスしているユーザーの端末はiOSなのかandroidなのかということが分かります。

MobileはiPhoneやiPadなどのapple製品で、androidはその名の通りandroid系です。

自分はまだ経験したことはないですが、OSやブラウザごとに処理を変えたい時に使うものなんだとおもいます。

以上です。何か間違いがございまし

元記事を表示

継承を使う際の注意点

# 概要

ソフトウェアエンジニアとして働き始めて早一年、それなりに大きなリポジトリのソースコードを扱ってきました。
様々なコードを読み書きする中で、とりあえず仕様を満たすコードを書くだけではなく、どのような設計・アーキテクチャにするかについて考え、勉強するようになりました。
この記事では、実務での経験を踏まえて**クラスの継承**を使う際の注意点について書いてみたいと思います。言語はRubyですが、他の言語を書いている方でも読めると思います。
※コードの内容は実際のものではなく、デフォルメしています。

# 想定読者
以下のような読者を想定しています。

– アプリケーションの設計やアーキテクチャに興味を持ち始めた人
– とりあえず仕様を満たす処理は書けるが、コードがすぐぐちゃぐちゃになってしまう人
– 個人で小さいアプリケーションを開発した経験はあるが、複数人で開発している比較的大きいアプリケーションには触れたことがない人
– プログラミング言語の基本的な文法は理解し、オブジェクト指向などを学んでいる人

# 家の情報を扱う
この記事ではサンプルとして、家(一戸建て)の情報を扱おう

元記事を表示

Ruby on Rails チュートリアル第12章をやってみて

#パスワードの再設定
■第12章
本章では、ここで生成したメイラーにリソースとデータモデルを追加して、パスワードの再設定を実現していく。

##12.1 PasswordResetsリソース
必要なデータをUserモデルに追加していく。11章では`edit`アクションのみだったが、今回はフォームが必要なので`new`アクションと`edit`アクションが必要。

###12.1.1 PasswordResetsコントローラ
パスワード設定用のコントローラを作成する。今回はビューも扱うため、`new`アクションと`edit`アクションも一緒に生成する。

“`rb
$ rails generate controller PasswordResets new edit –no-test-framework
“`

新しいパスワードを再設定するためのフォームと、Userモデル内のパスワードを変更するためのフォームが必要になるので、`new`、`create`、`edit`、`update`のルーティングも用意する。

以下のコードを追加。

“`rb:routes.rb
resour

元記事を表示

Ruby on Rails チュートリアル第11章をやってみて

#アカウントの有効化
■第11章
この章では、アカウントを有効化するステップを新規登録の途中に差し込むことで、本当にそのメールアドレスの持ち主なのかどうかを確認できるようにしてみる。

##11.1 AccountActivationsリソース
セッション機能 を使って、アカウントの有効化という作業を「リソース」としてモデル化する。

###11.1.1 AccountActivationsコントローラ
AccountActivationsコントローラを生成。

“`rb
$ rails generate controller AccountActivations
“`

ルーティングに`resources`行を追加。

“`rb:routes.rb
resources :account_activations, only: [:edit]
“`

###11.1.2 AccountActivationのデータモデル
ハッシュ化だったり、3つの属性が必要。

“`rb
$ rails generate migration add_activation_to_users \
>

元記事を表示

gem bullet による警告が消えても必ずログを確認する必要がある

初学者向けに書きました。
これはまだ自分が初学者だった頃のメモです。もはや何番煎じかわからない内容ですが、何か記事を書きたかったので書きました。
間違い等ありましたら申し訳ございません。ボコボコにコメントしてやってください。すぐ直します。

# 伝えたいこと
– bulletを使用していても検知されないN+1問題がある。
– bulletによる警告が出ていないからといって満足して終わらないように。ちゃんとチェックしよう。
– N+1問題が解決していても本当にそれが最適な処理になっているのか吟味しよう。

# bullet とは
– N+1問題を検知するgemです。詳しくは[公式](https://github.com/flyerhzm/bullet)で。

# 問題①:検知できないN+1問題
例えば、以下のコードはN+1問題を発生させますが、この問題はbulletでは検知できません。

“`ruby
class Post < ApplicationRecord has_many :comments end @posts = Post.preload(:comments)

元記事を表示

Ruby3.1.1のインストール(忘備録)

エラー内容を載せてなくてすみません。とりあえずの忘備録。

macOS Monterey(12.2.1)
CPUはIntel

“`
$ rbenv install -v 3.1.1
“`

がこける

以下やったこと

これをみると`binutils`が新しいといいらしい
https://github.com/rbenv/ruby-build/issues/1723

自分は入ってなかったので

“`
$ brew install binutils
“`

とした上で(binutils 2.37が入りました)pathを通す

.zshrcに

“`
export PATH=”/usr/local/opt/binutils/bin:$PATH”
“`

を書く

まだダメだった(opensslのビルドでだめ)のでopensslをHomebrewで入れてある`openssl@1.1`の方を使う
参考: https://qiita.com/mikan3rd/items/d1dfd7cb62cc23393dd9

“`
$ export RUBY_CONFIGURE_OPT

元記事を表示

Rubyでif文の戻り値を代入するときのコーディングスタイル、あなたはどっち!?

## はじめに
Rubyではif文の戻り値を変数に代入することができます。その場合、大きく分けて次のような2つのスタイルがあると思います。

“`ruby
# = と if を同じ行に書く
greeting = if japanese?
‘こんにちは’
else
‘Hello’
end
“`

“`ruby
# if を一段改行する
greeting =
if japanese?
‘こんにちは’
else
‘Hello’
end
“`

他にもこういうスタイルもあるかもしれませんが、あまり見かけないので、今回は除外します。

“`ruby
# 2行目以降はインデントさせない
greeting = if japanese?
‘こんにちは’
else
‘Hello’
end

# 2行目以降は1つだけインデント
greeting = if japanese?
‘こんにちは’
else
‘Hello’
end
“`

あと、「

元記事を表示

Excel 表記の変換 R1C1 から A1 へ / A1 から R1C1 へ

Excel 表記の変換方法です。
R1C1表記 から A1表記 へ、 そして A1表記 から R1C1表記 への変換ができます。

Codeforge の 1B がこれに似た問題です。 最近は Excel での作業もそこそこあり、 たまに使いたくなることがあります。

## 関数・定数定義

“`ruby
RC_PATTERN = /\AR(\d+)C(\d+)/
ABC_PATTERN = /\A([A-Z]+)(\d+)\z/

def cv_rc(value)
v = 0
for c in value.split(”)
v *= 26
v += (c.ord – ‘A’.ord + 1)
end
v
end

def cv_a(value)
(‘A’.ord + value – 1).chr
end

def cv_ab(value)
return ” if value == 0

cv_ab((value – 1) / 26) + cv_a((value – 1) % 26 + 1)

元記事を表示

Rails ToDoアプリ タスク管理アプリ (期限切れ・締め切り順・完了ボタン)

# はじめに
雑記事です。また時間を見つけてブラッシュアップいたします。

##完成図
![スクリーンショット 2022-02-19 6.33.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/f9517dd6-6b17-785d-7b13-1948c146b7a2.png)

・タスク一覧に残り期限が表示されている
・タスク一覧にタスクが期限順に並んでいる
・期限切れの未完了タスクの表示を変更している
・未完了タスクに完了ボタンが表示されている
・完了ボタンを押すと、完了したタスク一覧に完了日時が表示される

##前提
タスクの簡単なタイトル投稿が作成済みであること
Railsの基礎的な知識を身につけていること

##実装方法
まずタスクを保存する該当のテーブル(本記事ではtweetsテーブル)にタスクの期限を格納するtimeカラムと、タスクが完了した日を格納するdone_atカラムを追加する

### データベース

以下のコマンドでマイグレーションファイルを生成します。

元記事を表示

OTHERカテゴリの最新記事