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

Rails関連のことを調べてみた2022年06月17日
目次

リプライ機能を実装するには?Day2

オリジナルアプリ開発Day2、2本目の記事です。自分のメモのために書いています。

# RDB構造でリプライ機能実装する方法は?
Twitterやyoutubeのコメント欄のように、コメントに対して、コメントをする機能をreplyと言いますが、その機能をどのようなRDB設計で再現すればいいのか考えていました。

自分が考えたものも含めて、解決策は5つ。

## 先人たちが見つけてくれた解法
・隣接リストモデル(ナイーブツリー).
・経路列挙モデル
・閉包テーブルモデル
・入れ子集合モデル

よく纏められたサイトがあったのでそちらをご紹介します。

https://www.wantedly.com/companies/tutorial/post_articles/299434

https://www.slideshare.net/kamekoopa/ss-27728799

自分ならば、上記4つの解法の中から1つ選ぶとしたら、閉包テーブルモデルを採用すると思います。

## 自分が考えた解法
コメントテーブルに対して、コメントのIDを外部キーとしたリプライテーブルを作成します。これで、

元記事を表示

TECH CAMP11日目 ~中間テーブル~

# 中間テーブルとは
・多対多の関係性があるテーブルの間に設置するテーブル
・接続する2テーブルの外部キーをもつ

分かりやすい記事↓
https://qiita.com/ramuneru/items/db43589551dd0c00fef9

## 注意
テーブル間にアソシエーションを書く時、
例)usersテーブル、tagsテーブル、tweetsテーブルがある時、

Userモデルには
`has_many :user_tweets`
`has_many :tweets, through: :user-tweets`
の順番でかく。
`has_many through`で経由するテーブルとのアソシエーションを先に記載しないとエラーになる。

元記事を表示

DBってどんな種類があるの?Day2

# 今日の問題
オリジナルアプリ開発のday2です。今日は要件定義の作成、DB設計をやっていました。Twitterのようなフォロー機能を作る時どのようなDB設計を作ればいいのかわからず、DB設計について調べました。今回はDBについてまとめます。

# DBは3種類ある
テックキャンプではRDB(リレーショナルデータベース)についてしか学びませんでしたが、DBは主に3種類あるそうです。

### 1、階層型データベース
1つの頂点(親)が存在し、その下に複数の子供、孫が結び付けられている構造です。常に親とこの関係は「親1人対子1人」か「親1人対子多」の関係しか持てません。
![絵-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707093/98e7b1ef-7995-1f23-b12d-6981cc154667.jpeg)
#### メリット
・「各ノード(親や子、孫などを示している丸1つ1つのこと)へのルートが決まっているので、処理速度が早くなる」というもの。
#### デメリット
・データの追

元記事を表示

database.ymlを編集する事で変えられるもの

Q.
database.ymlを編集する事で何が変わるのか?

A.
運用環境を変えられる。database.ymlで表記されている単語は下記の意味である。
development:開発
test:テスト
production:本番

Q.
そもそもなぜ変える必要があるのか?

A.
開発環境では、バグを見つけやすくするツールを導入するために必要
本番環境ではバグを見つけやすくするツールが導入されていると余計な処理が増え、処理に時間がかかる事を防ぐため

元記事を表示

【Rails】docker-compose 基本コマンド

railsコマンド

##### モデル作成
“`
docker-compose run web bundle exec rails g model モデル名 カラム
“`
モデルは単数系で頭文字は大文字٩( ‘ω’ )و

##### マイグレーション
“`
docker-compose run web bundle exec rails db:migrate
“`

##### コントローラー作成
“`
docker-compose run web bundle exec rails g controller posts new
“`

その他

##### build時にキャッシュを使わない
下記コマンドは変更内容が反映されない時に使います
“`
docker-compose build –no-cache
“`

##### dockeの中に入る
dockerのコンテナ名は docker psで確認!
“`
docker-compose exec #{container} bash
“`

##### Gem一覧確認コマンド
“`
d

元記事を表示

nested_attributesの中のattr_accessorが時々callbackを発火させない件

# TL;DR

“`rb
class User < ApplicationRecord has_many :comments, dependent: :destroy accepts_nested_attributes_for :comments, allow_destroy: true end class Comment < ApplicationRecord attribute :foo, :string after_validation do p "foo: #{foo}" end end ``` ```rb User.last.update(comments_attributes: { id: 1, foo: 'Foo' }) => true
“foo: Foo”
# この時`comment`の`updated_at`も更新されること
“`

# 発端
とあるプロジェクトがコメントの添付画像の削除機能が必要でしたが、普通に`attr_accessor :img_destroy`でフラグ置きました。
ただし実装したところ、「コメント変更

元記事を表示

rails コントローラ別 アクション別に別々のlayoutを読み込む方法(自分用)

https://www.javadrive.jp/rails/template/index3.html#section3

元記事を表示

【随時更新】RSpec でハマったエラー

### はじめに
初心者ですので、言葉足らずなところや間違えがあるかもしれません。
お気づきになりましたら、ご指摘いただけると嬉しいです。

# ログインできない

##### エラーコード
“`
Failure/Error:
expect(current_path).to eq(root_path)

expected: “/”
got: “/users/sign_in”

(compared using ==)
“`
“/”に遷移しようとしたけど、結果は”/users/sign_in”ですよ。
つまり、遷移できずにログインページのままになりエラー。
##### ソースコード(一部)
“`ruby:system/users_spec.rb
#省略

# 正しいユーザー情報を入力する
fill_in ‘email’, with: @user.email
fill_in ‘password’, with: @user.password
# ログインボタンを押す
find

元記事を表示

「まだRailsでstrftime使ってるやついる?」「いねえよなぁ!!?」【日時のフォーマットをja.ymlで管理する】

※ 結論だけ知りたいという人は[解決法](#解決法)から見てください

「まだRailsでstrftime使ってるやついる?」

「いねえよなぁ!!?」


はい、使ってます。

`strftime`を使用して、日時をフォーマットする際
“` erb:View

<%= @model.time.strftime('%Y年%m月%d日 %H時%M分') %>

“`
のように毎回記述する必要があり
「いちいち指定しなくても同じ形式でフォーマットしてほしい」
「フォーマットをまとめて管理したい」
といった悩みに苦しめられてきました。

「仕方ない」と諦めていたこの悩み…解決する方法を実は見つけてしまったのです。

私みたいに諦めてstrftimeを使っているそこの貴方、今まさにstrftimeを使おうとしているそこの貴方。
「もっと早く気づいていれば、もっといい感じにプロダクトを作れた」
と思うその前に、是非参考にしてみてください。

# strftimeとは?
strftimeは、日時のデータを指定したフォーマット文字列に変換で

元記事を表示

URLパラメータ(クエリ文字列)は文字列で取得されますよ。

先日会社でサービスの開発をしている時、URLパラメータを取得しているのに読み込まれていない事案が発生しました。
案外ミスしがちなポイントだったので記事に残します。(タイトルが結論ですが。)

# やりたかったこと
URLパラメータをインスタンス変数に入れてviewで表示内容を変えるというものです。

“`controler.rb
@user_type = params[:id] # URLパラメータの値を取得
“`

“`view.rb
<% if @user_type == "1" %>
<%= link_to %>
<% end %>
“`

# はまりポイント
はまりポイントというほどでもないですが、ちょいはまりくらいです。
URLパラメータは文字列型で取得されることです。
ですので「よし、id=1のパラメータを取得したぞぉ」といって“`if @user_type == 1“`と書いても認識されないわけです。

# まとめ
「URLパラメータは全て文字列で取得される。IntegerやArrayで使用したい場合は都度、変更する必要があ
る。」
URLパラメー

元記事を表示

テックキャンプ現役受講生のアプリ開発1日目

みなさんこんにちは!今日は要件定義とDB設計をやっていました(+読書)。学んだことのアウトプットします。本日は2つです。

# 起業家の思考法(平尾著)を読んで学んだこと
起業アイデアの出し方について書かれた本です。アプリ開発のアイデア出しに応用できるかなと思って読んでいました。主に応用できるアイデアは2つ。

1、目的を見つけ、現状を分析して、それらの差分が解決すべき課題である。
上記の文脈に合わせて、一つアイデアを出してみます。
例えば、フードロスは0の方がいいよね(目的)。⇨日本ではフードロスが年間○千万トンある(現状)。⇨賞味期限ギリギリの食材を廉価で流通させる市場を作ればいい(課題&解決アイデア)。というような感じです。今回は何らかの問題の解決を、アプリでしようと思います。

2、自分らしさ、優秀な手法、逆説(意外性)の3つを掛け合わせたものが、素晴らしい解である。
上の3要素が合わさらないと、素晴らしい解決策にはならないということです。
・自分らしさとはそのまま個性のこと。
・優秀な手法とは、世に認められている素晴らしいやり方やこと。
・逆説はそのまま
自分らしさだけを全面

元記事を表示

ActiveRecord オブジェクトを dup メソッドでコピーする場合は、インスタンス変数もコピーすることに注意する

# バージョン情報

“`shell
$ ruby -v
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [arm64-darwin21]

$ bin/rails -v
Rails 7.0.3
“`

# 内容

ActiveRecord オブジェクトの属性 (attributes) を引き継いだ別のオブジェクトを作成し、データベースに保存したい場合に [ActiveRecord::Core#dup](https://api.rubyonrails.org/classes/ActiveRecord/Core.html#method-i-dup) を使用することがある。この場合、たしかに属性は引き継がれるが、同時に [Object#dup](https://docs.ruby-lang.org/en/3.1/Object.html#method-i-dup) の振る舞いにより**インスタンス変数の値も引き継ぐ**。

https://docs.ruby-lang.org/en/3.1/Object.html#method-i-dup よ

元記事を表示

TECH CAMP 10日目 ~テストコード~

# 学習内容
– テストコード
`visit`指定したビューファイルに遷移できるメソッド
`fill_in`入力フォームに指定の値を入力することができるメソッド
`have_content()`()に書いた文字列があるかどうかを判断するマッチャ
`have_no_content()`()に書いた文字列が存在しないことを確かめるマッチャ
`hover`特定の要素にカーソルをあわせたときの動作を再現できる
`find().click`()内のリンクに実際にクリックができる
`change`expect{ 何かしらの動作 }.to change { モデル名.count }.by(1)と記述することによって、モデルのレコードの数がいくつ変動するのかを確認できる
`current_path`現在いるページのパス

元記事を表示

MySQLの “The server quit without updating PID file” エラーの対処法

以前rails sをしようとしたときに、The server quit without updating PID file のエラーにハマったので対処法を紹介します。
自分の場合は、mysqlを再インストールし、パスワードを設定したら無事に解消できました。
## 1.mysqlを再インストール
再インストールについては、下記の記事を参考にしました。
https://gonzaemon.site/posts/2019/10/04/_2.html

基本的には、
“`
brew uninstall mysql
brew install mysql
which mysql
“`
すれば、再インストールできます。
そして、再インストールしたらいけるかと思いきや
“`
‘Access denied for user ‘root’@’localhost’
“`
と言うエラーが出てしまいました。
この対処法としては、パスワードを設定すれば解消できると思います。

## 2.パスワードを設定

自分の場合は、この記事を参考にしました。
https://webkaru.net/mysql/mys

元記事を表示

Railsの絞り込みルーティング検索

### 「rails routes」のキーワード検索方法

`rails routes`を実行したときに、目当てのルーティングを見つけるのにいつも時間がかかっていました。
が、下記のコマンドを実行するとキーワードで絞り込み検索できるということを知りました!!

“`
$rails routes | grep users

#「users」部分は好きなキーワードに変えてください!
“`

ちなみに、grepは検索するときに使うLinuxコマンドらしいです!

元記事を表示

【Rails】コントローラーにたくさんコードを書いてしまった・・・そんな時はモデルに処理を寄せよう!

どーもへっぽこです。
コントローラーって便利ですよね、ルーティングしてアクション呼び出すだけでその中の処理を走らせることができる。
ついつい便利で・・

“`ruby
def A
a = 3
b = 2
c = a + b

return c
end

def B
a = 4
b = 2
c = a + b

return c
end

def C
a = 7
b = 6
c = a + b

return c
end

def D
a = 1
b = 9
c = a + b

return c
end

def E
a = 6
b = 2
c = a + b

return c
end

“`

たくさんコードを書いてしまう。。
しかし、こんなコントローラーのことをなんと呼ぶか知ってますか?

![topics_46_4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007139/7a3b

元記事を表示

【Linux EC2】PIDではなく、プロセス名で kill するコマンド

# プロセスをPIDではなく名前で kill する
結論こちらで可能(Amazon Linuxで動くよ!)

“`bash: プロセス名を指定して kill できます
pgrep -f ‘プロセス名’ | { read v ;kill -9 $v; }
“`

## 使い方
まずはこちらで殺したいプロセスの名前を調べましょう。

“`
ps aux | grep プロセス名
“`

railsで unicorn のプロセスを殺したい場合はこんな感じ。

“`bash
ps aux | grep unicorn
“`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/e3fe22ea-b407-1b86-cb96-f2c9d59f47af.png)

## 時間の右に書いてあるのがプロセス名
今回の場合は `unicorn_rails` になるのですが。
`unicorn_rails` で絞るとその下にある worker[0]~[3] も引っかかってしまいます。

元記事を表示

rails new でDBMSにmysql使用しようとしたら失敗した時の解決メモ

## rails new アプリ名 -d mysql で発生した ERROR! The server quit without updating PID file

### やったこと

`$ rails new sample-app -d mysql`で新規プロジェクトを作成しようとした

### エラー

以下のエラーでプロジェクトの作成ができなかった

“`
Starting MySQL
./usr/local/Cellar/mysql/8.0.19/bin/mysqld_safe: line 144: /usr/local/var/mysql/ユーザーMBP.err: Permission denied
rm: /usr/local/var/mysql/ユーザーMBP.pid: Permission denied
2020-03-29T03:04:45.6NZ mysqld_safe Fatal error: Can’t remove the pid file:
/usr/local/var/mysql/ユーザーMBP.pid.
Please remove the file

元記事を表示

[Rails] 個人的にとてもわかり易かったモデルにメソッドを移行(定義)する方法

### はじめに
ファットコントローラーを回避するためにモデルにメソッドの定義する方法を、調べても調べても理解出来ず諦めていましたが
先日個人的には超わかりやすい方法教えて頂けたため記事にしています。
簡単なものを書き出せるようになるだけでインスタンスメソッドとかクラスメソッドとかがほんのちょっと理解できるようになりました!

おまけ:クラスやインスタンスについてはこちらでまとめてみました!

https://qiita.com/nmwkhl/items/c521ab9398906ef30961

### メソッド化のメリット
同じ記述を何度もしなくて済む
誰もが同じ効果を発揮できる
セキュリティ問題  など様々あります

特に最後のセキュリティ問題については重要で
“`erb
<% if @user == current_user %>
<%= @user.email %>
<% end %>
“`
この様な記述があった際に
仮にタイポして`if @user = current_user`にしてしまったとします。これはただ代入しているだけの記述になってしまい

Railsのテストコードの書き方について

## 概要
こんにちは。shunです。前職ではテストコードを書いたことがなかったため、今回は自分用のメモもかねてRailsでのテストの書き方について説明していきたいと思います

## 前提
– テストを書いたことがない
– Ruby 2.6.6
– Rails 6.0.5
– Rails標準のテスティングフレームワークであるMinitest(後述)を使います
– テストを書いたことない人向けなので今回はRspecは使いません
(今後Rspecについての記事も書いてみたいです)

## そもそもテストって何?なんでテストが必要なの?
テストはプログラムが想定通りの動きをするか確認するためのものでここでは3種類のテストを取り上げます
– Unit test(単体テスト)=モデルのテスト
– Controller test(機能テスト)=コントローラのテスト
– Integration test(結合テスト)=全体の動作の流れのテスト

また、テストコードを書く理由としては主に

– リファクタリングを実施しやすくするため
– コードの品質を高めるため
– テストを自動化するため
– バグを