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

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

Ruby 2.5.0コンテナでRails6の開発環境を作るときのトラブルシューティング

こちらのハンズオンをやっていたところ、いくつかの問題に遭遇したので備忘録。

[Rails アプリケーションをコンテナで開発しよう ! 第 1 回 – まずは Rails アプリケーション作りから](https://aws.amazon.com/jp/builders-flash/202009/container-rails-app/?awsf.filter-name=*all)

## Rails7のインストールに失敗する

記事では Ruby2.5 & Rails6 を使用しているが、現時点(2022/1)での最新版は `7.0.1`。
エラーメッセージにもあるように`7.0.1` ではRuby2.7以上が必要であるため `gem install rails`に失敗する。

“`bash
root@810c33297af8:/work# gem install rails
Fetching: concurrent-ruby-1.1.9.gem (100%)
Successfully installed concurrent-ruby-1.1.9
Fetching: i18n-

元記事を表示

【Rails 6】Formオブジェクトでシンプルな検索機能を作ってみる

## 概要

記事タイトル通り、Form オブジェクトを使用したシンプルな検索機能を Rails6 で作ってみます。

Form オブジェクトの概念については、以下の記事の表現が非常にわかりやすかったので参考にされてください。

> Formオブジェクトはフォームの責務をカプセル化し、コントローラやビューを疎結合に保つために必要なデザインパターンです。

> ユーザの入力の整形や永続化をコントローラだけで行うと、コントローラが肥大化してしまいます。 この原因はコントローラがモデル層の知識をもちすぎるためにあります。 このときビューもフォームを表示するための知識をもつことになるため、コントローラと同じような問題が起こってしまいます。 このことは単一責任の原則に反し、モデル層の変更がコントローラやビューに影響を及ぼすことになります。

> 逆にActiveRecordモデルにこういった責務をもたせると、今度はActiveRecordモデルがフォームの知識を持ちすぎてしまいます。 フォームという独立した責務があるのであれば、これをひとつのクラスにカプセル化する、というのがFormオブジェクト

元記事を表示

Model-View=Contoroller(MVC)メモ

#メソッド名とアプリケーションネームは同じ名前にする
していないとプレビューで
The action ‘goodbye’ could not be found for ApplicationController
と表示される。

“`application_controller.rb
class ApplicationController < ActionController::Base def hello #ここ render html: "hello, world!" end end ``` ```routes.rb Rails.application.routes.draw do # For details on the DSL available within this file, # see https://guides.rubyonrails.org/routing.html root 'application#hello' #ここ end ```

元記事を表示

掲示板にブックマーク(いいね)機能実装手順

##実装したいこと
・掲示板の☆ボタンを押すと、その掲示板をブックマーク/解除出来る機能。
・ユーザーがブックマークした掲示板を一覧できるページを実装。

##お気に入り機能実装の流れ
①中間テーブルとなるBookmarkモデルの実装
②Userモデルにbookmarkの定義を追加
③Bookmarksコントローラーの実装
④Boardコントローラーにbookmarkの定義を追加
⑤Routingの設定
⑥Viewの実装

##①中間テーブルとなるBookmarkモデルの実装
###Bookmarkモデルの仕組み(多対多)
**UserとBookmarkとBoardの関係**
Bookmarkモデルを実装する前に、モデルの関係を確認する。

・ユーザーはたくさんの掲示板をブックマークすることができる。
・反対に、掲示板はたくさんのユーザーにフォローされることができる。

つまり、UserもBoardもBookmarkをたくさん持っているということになる。このような関係を“多対多の関係“と言う。

[![Image from Gyazo](https://i.gyazo.com/a

元記事を表示

【SPA】RailsとReactとの間でsession(cookies)を扱う…??

# 事の始まり
( ^o^)「Railsチュートリアルに沿ってログイン機能を実装するぞ」

( ^o^)「なるほど…Railsのsessionメソッドを使うんだな…」

(; ^o^)__「…ReactとRailsでcookiesのやり取りってどうするんだ!?」__


現在、RailsとReactを用いてSPAの作成に挑戦中です。ログイン機能を実装する際に、cookiesのやり取りやsessionメソッドで作成されたcookiesなどに対して、疑問を抱いたので記事に残そうと思います。

## 開発環境
Mac OS Big Sur 11.6 (M1)
VSCode
Docker / Docker-Compose
Ruby 3.0.3p157
Rails 6.1.4.4
React 17.0.2
MySQL 8.0

## この記事で紹介すること、しないこと
### すること
axiosを使用したRailsとReactとのcookiesのやり取りなど。

### しないこと
環境構築の方法、RailsでCORSを許可するためのrack-corsの導入などについては紹介しません。

元記事を表示

【Ruby】引数をデフォルトで指定するときはキーワード引数を使おう

###キーワード引数

メリット

– 引数の順番を気にしなくていい
– 引数が何を指しているのかわかりやすい

####引数にデフォルト値を与える

“`ruby
def greet(name, message = ‘Hello’)
“#{message}, #{name}さん”
end

#messageを指定しないとデフォルト値がそのまま出力される
greet(‘Kato’)
#=> Hello, Katoさん

#デフォルト値を変更
greet(‘Kato’, ‘Hi’)
#=> Hi, Katoさん

#引数の順番を逆にすると意図してない動きをする
greet(‘Hi’, ‘Kato’)
#=> Kato, Hiさん
“`

####キーワード引数を使う

“`ruby
def greet(name: ‘名無し’, message: ‘Hello’)
puts “#{message}, #{name}さん”
end

#引数指定なし
greet
#=> hello, 名無しさん

#nameのみ指定
greet(name: ‘Kato’)
#=> Hello,

元記事を表示

【Rails】vendor/bundle 配下にbundle installしたgemを確認する方法

インストールしたgemのリストを表示するコマンドは

“`
$ gem list
“`
ですが、これだとカレントのruby versionでローカルにインストールしたgemのリストが表示化されます。

アプリケーションディレクトリーの`vendor/bundle` 配下にbundle installしたgemのリストを表示させるには

“`
$ bundle exec gem list
“`
を入力します。

元記事を表示

いつも忘れてしまうRailsの多対多 + 自己(関連先が自身のテーブル)参照 + 条件付き関連の書き方をフォロー・フォロワーを例にまとめる

## 概要

Railsでは has_many, belongs_to の関連をよく書くのでしっかり脳で覚えているのですが、
`has_many through` を使った多対多の関連はたまにしか書かないためくよく忘れてしまいます。

なので個人の備忘録としても、理解をしてより覚えるためにも図でまとめました。

## 例

* Railsチュートリアルでもよく使われている、Twitterのようなサービスを例にした「ユーザの相互フォロー」を記載していきます
* ユーザAさんは複数のユーザをフォローできます
* ユーザAさんは複数のユーザにフォローされます

### テーブル構造

* ユーザ情報(users)
* ユーザのフォロー関連(user_follow_statuses)

![スクリーンショット 2022-01-07 12.18.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101975/0dfad125-9ac6-485b-49dd-5328d552f89e.png)

## コード

元記事を表示

【Rails】「【trタグ】とはなにか?」「【thタグ】と【tdタグ】の違いはなにか?」

##【trタグ】とはなにか?
・行を表すタグです。
・このタグの間に書かれたものが同じ行となります。

(例)商品名や個数を同じ行にする場合

“`

商品名 個数 価格

“`

##【thタグ】と【tdタグ】の違いはなにか?
・thタグ:見出し用のタグ。太字で中央揃いになる。
・tdタグ:通常文用のタグ。左揃いになる。

###thタグとは
・セルを意味するタグの1つ
・このタグの間にテキストを書く
・書かれた内容は見出しとなり太字で中央揃いとなる。

(例)「個数」という見出しにする場合

“`

個数

“`

###tdタグとは
・セルを意味するタグの1つ
・このタグの間にテキストを書く
・書かれた内容は通常の文となり左揃いとなる。

(例)数字を書く場合

“`

300

“`

>引用元:https://www.hibinokoto01.com/entry/2017/02/27/044737

元記事を表示

rails s -e productionでBootstrapが適用されない

#環境
macOS Big Sur(11.6)
rails 6.1.4
bootstrap5

#崩れるbootstrap
普段はrails sでdevelopment環境で確認しているけど、rails s -e productionで本番環境の挙動を確かめたい。
しかし、開発環境ではBootstrap5がちゃんと表示されていたのに、production環境では体裁が崩れる。

#一応事前にはこちらは済んでます。
“`
$ rails asset:precompile
“`

#なんで?
production.logを見てみると

“`:production.log
ActionController::RoutingError (No route matches [GET] “/packs/js/application-81c24075e6920f66b791.js”)
“`
とかいうのが延々と出ている。
webpackerのコンパイルがうまくいっていないのか?と思い、以下を実行してもNG。
(実際はrails asset:precompile時点でwebpacker:comp

元記事を表示

userモデルを作る時に「undefined method `devise’」の解決法

#はじめに
 deviseを介してuserモデルを作る時に、「undefined method `devise’」というエラーが出て作成ができませんでした。ちょっとした記述ミスだったのですが、焦ったので備忘録としてまとめておきます。

#原因
 deviseは導入したはずだったのですが、遡ってみると

“`
% bundle install
% rails d devise install
% rails g devise user
“`
よくみてみると、「rails d devise install」という記述に「:」がない事に気がつきました。本来は「rails d devise:install」です。したがって今回の原因は「:」が抜けている事でした。。

しかし、問題は中途半端に処理は実行されていて、deviseのマイグレーションファイルは出来上がってしまっている事です。bundle install直後に戻さないといけません。

#対処法
 対処法としては以下の3つの手順を行いました。
①routes.rbに作られた、 「devise_for :installs」 という記述

元記事を表示

【Rails】Controllerの主な仕事内容

##Controllerの仕事内容
・Modelとのやり取りを行う。
・Viewに渡すインスタンス変数を定義する。
・表示するViewファイルを指定する。

元記事を表示

GETとPOSTについて

##HTTPメソッドが「GET」になるのはどんな時?
・アドレスバーにURLを入力した時。
・google検索で出てきたサイトをクリックした時。

##HTTPメソッドが「POST」になるのはどんな時?
・会員登録をする時。
・ブログの投稿を行う時。

###GET=サイトの表示を得る(GET)のがGETリクエスト
###POST=データの送信をする(POST)のがPOSTリクエスト

元記事を表示

【uniqueness: scopeの使い方】ブックマーク、いいね機能実装に使える

##uniquenessとは
バリデーションの1つ。Railsで一意であることを示す。
“scope“はuniquenessのオプション。

下記は人が投稿したものに対してブックマーク(いいね)機能を入れた時のmodel例。
1投稿に対して、1人のユーザーが1ブックマーク(いいね)しかすることができないため、このようなバリデーションになる。

“`models/bookmark.rb
class Bookmark < ApplicationRecord belongs_to :user belongs_to :board validates :user_id, uniqueness: { scope: :board_id } end ``` もし``scope``を付与せずにいると、 ```models/bookmark.rb validates :user_id, uniqueness: true ``` 「1投稿」に対して「1ブックマーク(いいね)」しか付けることしか出来ず、**早い者勝ちで一番最初に誰かがブックマーク(いいね)をしたら、それ以上その投稿

元記事を表示

AWS / CircleCI / Docker を使ったアプリの完成(仮)

# プロフィール
・実務未経験の27歳
・大学院卒業 〜 現在まで約2年フリーターとして就業中
・週3, 4勤務
・プログラミングスクール卒業生

目標にしていたAWS、Docker、CircleCIの導入ができたので一旦これでポートフォリオの完成にしようと思います。インフラの勉強むずい!

# ポートフォリオについて

## はじめに
一般公開しています。何かコメントいただけるととても嬉しいです:smile:
https://www.nitinitikoretanren.net/

## 機能一覧
日々の運動習慣を記録できるアプリで、機能は大きく分けて三つあります。

1. 運動した時間や走行距離などをグラフとして描画できる機能
2. 基本的なCRUD機能を持つつぶやき投稿(つぶやきの新規作成、編集、削除、一覧表示)
3. つぶやき投稿に対するいいね機能

## テストユーザーの使用例
* ランニング → 走行距離・走行時間
* 筋トレ → 筋トレ部位・筋トレ時間

上記のように、ユーザーは「ランニング」と「筋トレ」に分けて運動を記録することができます。
それらのデータを使って三種

元記事を表示

migrationファイルのadd_indexは何なのか

##add_indexとは
よくマイグレーションファイルに“add_index :~“と記述があるがいまいち何でこれを書いているのか分からなかったので、調べてみた。

“add_index:“とは特定のカラムからデータを取得する際に、“テーブルの中の特定のカラムのデータを複製し検索が行いやすいようにする“ための記述。

多くのデータを格納するテーブルの、格納される値がそれぞれ異なるようなカラム(unique制約のかかったカラムなど)の中で、“検索がよく行われるカラム
に対してadd_indexの記述を張ることで検索を簡単にしたいときに使う。“

##記入法

“`
add_index :追加したいテーブル名, カラム名, 必要ならオプション名

#記入例
class CreateBookmarks < ActiveRecord::Migration[5.2] def change create_table :bookmarks do |t| t.references :user, foreign_key: true, null: false

元記事を表示

Vuex(Store)で保存したデータがリロードすると消える

## はじめに
フロントエンドにNuxt.jsを使用し開発中、Vuexに保存した情報が
リロードすると消えてしまって少しはまったその備忘録

## 環境
macOS
Nuxt.js Rails Docker postgresql

## Storeについて
【Nuxt.jsでStoreにデータを保存するメリット】
componentsでもStoreから直接データを持ってこれる
※ Storeを使用しないとProps/emitを使用し各componentsへデータを渡さないといけない

## 対策
[vuex-persistedstate]を導入し
Storeに保存されたデータを[LocalStorage/SessionStorage]へ保存し
リロード時にデータを照合しStoreのデータを復元する
※今回はlocalStrageに入れます

## vuex-persistedstate導入
“`
root $ docker-compose run front yarn add vuex-persistedstate
“`

## localStrage.js作成
“`
fron

元記事を表示

【Rails】memberとcollectionの違い

##“member“と“collection“が使われる理由
どちらもresourcesでroutingを設定しているとき、“resourcesでは自動で生成されないactionへのroutingを設定“するときに使用するもの。

“member“,“collection“ルーティングを行うと、**新たにルーティングした**“〇〇_photo_urlヘルパー“と“〇〇_photo_pathヘルパー“も作成される。

##“member“と“collection“の違いとは
生成するroutingに、“:id“の有無で決まる。

“:id“とは 、URL内に記述されるIDのことである。

“`
#rails routes

#id有
/users/:id/follow(.:format)

#id無
/users/slide(.:format)
“`

“menber“はidが**有り、**“collection“はidが**無い。**

**◆member記入例**
この場合は“user resources“に“foll

元記事を表示

Rails 7.0でbootstrap-iconsを使う方法

Rails 7.0でbootstrap-iconsを使う方法を紹介します。

https://icons.getbootstrap.com/

## おことわり
この方法がベストかどうか確信がないので、もっといい方法があればコメント欄等で教えてください :pray:

## 前提条件

以下のコマンドでrails newしたRails 7.0アプリを想定します。

“`
rails new everydayrails-rspec-jp-2022 –css bootstrap
“`

また、この記事で使う bootstrap-icons のバージョンは1.7.2です。

https://www.npmjs.com/package/bootstrap-icons

## 手順

bootstrap-iconsをインストールする

“`console
npm i bootstrap-icons
“`

`app/assets/stylesheets/application.bootstrap.scss`に以下の行を追加する

“`scss:app/assets/styleshe

元記事を表示

redirect_toとrenderメソッドの違い  

#はじめに
 『なぜredirect_toではなくてrenderを使うのだろう??』
 「renderのメリットは何??」
画面遷移を行うrenderメソッドとredirect_toメソッドについて、このような疑問が湧いたのでまとめてみました。

#renderメソッドとredirect_toの違い
 画面遷移を行うメソッドはrenderとredirect_toの二つがあります。2つのメソッドの違いは
①render→リクエストを送らず、そのままviewを表示
②redirect_to→再度リクエストを送り、routing→controllerを通りviewを表示させる
です。

#renderとredirect_toの使い方
 renderとredirect_toはそれぞれどのように使うのでしょうか。1つの例として、updateアクションで更新に成功したらredirect_toでトップページに戻る。ブランクなどで更新に失敗したらrenderでeditページに戻るという実装があります。

“`hoge_controller.rb
def update
@hoge = H

元記事を表示

OTHERカテゴリの最新記事