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

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

[Rails]すでにあるテーブルのカラムにバリデーションを設定したい

モデル設計時にテーブルのカラムにNotNULL制約を付け加えるのを忘れてしまった。。。
そんな時にテーブルのカラムに後からバリデーションを付与する方法を紹介します!

### 環境
・macOS
・Rails 5.2.6.3
・ruby 2.5.1

## 既にあるテーブルのカラムにバリデーションを追加する手順

1、新規マイグレーションファイルを作成
2、マイグレーションファイルに追加したいバリデーションを記入
3、rails db:migrateを実行

それでは実践に入っていきます。

### 実践
私はusersテーブルのnameカラム・emailカラム・passwordカラムにNOTNULL制約を付け加えるのを忘れたので付け加えていきます。上記の3つの手順に従って、

##### 1、新規マイグレーションファイルを作成する
“`ruby
rails g migration change_user_validation
“`
これでマイグレーションファイルの作成が完了。

##### 2、マイグレーションファイルに追加したいバリデーションを記入する

“`ruby
cla

元記事を表示

Ruby 問題 if,else ポイント付与サービス

# はじめに
1月〜プログラミングスクールで学習しています。
これから平日は~3/25まで毎日何かしらアウトプットのため投稿を続ける予定です。
今回は if,elseを使って簡単なポイント付与サービスを実装します。
※Ruby2.6.5の環境を使用し学習しています。

# 問題
トレーディングカードショップで商品を購入するとポイントが付与されます。
以下条件によってポイント付与率が変わります。
– 購入金額が9999円以下の場合、1%のポイント
– 購入金額が10000円以上の場合、2%のポイント
このように付与されるポイントを出力するメソッドを作ります。

また、購入者が誕生日の場合はポイントが5倍になります。
誕生日の場合はtrue, 誕生日でない場合はfalseで表します。
また、小数点以下をすべてのポイント計算が終わったあとに.floorメソッドを使って切り捨てます。
“`Ruby:例
calculate_points(500, false) → 5ポイント付与されました。
“`

# 実装例
まずは購入金額が9999円以下の場合、1%のポイント、購入金額が10000円以上

元記事を表示

psych::badalias: unknown alias: defaultで Railsコマンドが使えないを解決

## はじめに
Rails6の環境を構築している際に発生したエラーに対処していきます。

## 環境
M1 Mac
VS code
Ruby 3.1.0
bundler 2.3.3

## エラーメッセージ
`psych::badalias: unknown alias: default`

## 発生した理由
psychというYAML解釈用のGemの4系と3系で解釈が変わっているのが原因です。
こういったversionの違いで起きるエラーは大変ですね。

## 解決方法
3系を使うように指示を出します。

`gemfileに下記を追加`
“`rb
gem ‘psych’, ‘~> 3.1’
“`

保存して`bundle install`を実行
出来なければ `bundle update`を実行

## おわりに
個人的な話ですが、Ruby on Railsチュートリアルで`mimemagic`問題で4日間エラーと戦ったあたりから
エラーメッセージを見ても怖くなくなりました笑

## 参考

https://teratail.com/questions/343233

元記事を表示

Rails mimemagic問題でRails new . できないを解決

## はじめに
Rails 6系の環境を用意している際に`mimemagic`問題に遭遇した

## 環境
M1 Mac
VS code
Ruby 3.1.0
bundler 2.3.3

## エラーコード
“`rb
Ensure you have either installed the shared-mime-info package for your distribution, or
obtain a version of freedesktop.org.xml and set FREEDESKTOP_MIME_TYPES_PATH to the location
of that file.

This gem might be installed as a dependency of some bigger package, such as rails,
activestorage,
axlsx or cucumber. While most of these packages use the functionality of this gem, some gems
h

元記事を表示

フロントエンドとサーバーサイドをワンコマンドで起動させる方法

どうも**2年目**に突入した**ひよっこエンジニア**のへっぽこです。
もちろんQiitaはもっぱら見る専。アウトプット?なにそれ美味しいの?って感じで生きてきました。

ところが今年から会社の命令で月1本記事を上げないといけなくなりました。
~~ホント迷惑な話だ。~~
ということで、渋々僕の浅はかな知識をアウトプットします。

ちなみに余談ですが、普段は個人でブログ運営してます(プログラミング全く関係なし)。
ポケモンの記事とか**超炎上**してるんで、気になる人は見てってね。

https://heppoko-neet.com/

## フロントエンドとサーバーサイドをワンコマンドで起動させる方法

今回はRailsとReactを例とします。
コマンド部分を変えれば他の言語でも同時で起動できると思いますのでお試しください。

まずhomeディレクトリーへいきます。
“`
cd
“`

次に
“`
touch rails_react_run.sh
“`
でスクリプトファイルを作成します。

viコマンドでスクリプトファイルを編集します。
“`
vi rails_react

元記事を表示

ユーザー情報の編集機能

ユーザーの編集機能を実装する。

編集の時に登録したパスワードは変更しないようにしたいので、今回の編集項目にはパスワードは入れない。

パスワードを不要にするための手順は以下の通り。

ますは“controller/users/registrations_controller.rb“を編集する。

“`ruby:controller/users/registrations_controller.rb
# 以下を追記する
protected
def update_resource(resource, params)
resource.update_without_password(params)
end
“`
※registrations_controller.rbを生成するためには、ターミナルで“rails g devise:controllers users“を実行する必要がある

続いて“routes.rb“を編集。

“`ruby:routes.rb
Rails.application.routes.draw do

#以下を追記する

元記事を表示

【Rspec】Error: raise WrongScopeError の解消法

RSPecでテストを実行すると以下のエラーが発生。

“`
Failure/Error:
raise WrongScopeError,
“`#{name}` is not available from within an example (e.g. an ” \
“`it` block) or from constructs that run in the scope of an ” \
“example (e.g. `before`, `let`, etc). It is only available ” \
“on an example group (e.g. a `describe` or `context` block).”

`name` is not available from within an example (e.g. an `it` block) or from constructs that run in the sco

元記事を表示

Heroku × Rails × MySQL でアプリケーションをデプロイする際のトラブルシューティング集

# はじめに
Heroku では、PostgreSQL は手厚くサポートされているが、MySQL で構築しようとするとハマることが多い。

今回は筆者が MySQL を使って Rails アプリケーションを Heroku にデプロイした際にハマった部分とその解決策を紹介する。

# 前提知識 (読み飛ばし可)
## MySQL で `rails new` する方法
既存のアプリケーションコードではなく、今回新しくアプリケーションを立ち上げる場合、つまり `rails new` からスタートさせる場合は、`-d mysql` オプションをつけると、データベースに MySQL を使用する前提でアプリケーションコードの雛形を生成することができる。

“`shell:Shell
rails new app -d mysql
“`

デフォルトだと SQLite なので、それを MySQL に書き換える手間が省けて便利。

## MySQL を使用するために必要なアドオンについて
Heroku で MySQL を使用する際には、JawsDB または ClearDB のいずれかのアドオン

元記事を表示

【rails】ルートにposts/indexを指定している状態で、posts/indexをURLに打ち込んだらエラーが起きた。その原因と解決策

# 状況
– localhost:3000/posts/indexにアクセスしたら以下のエラー
![スクリーンショット 2022-03-09 20.31.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381701/929965d9-9940-8b4b-0acc-410df64ff0ab.png)

# 原因
– ルーティングにposts/indexが指定されていなかった

# 原因に気付かなかった理由
– rootにposts/indexを指定していたからそれで十分だと思っていた
– resouces:postsがあるからそれで十分だと思っていた
“`routes.rb
Rails.application.routes.draw do
devise_for :users,
controllers: { registrations: ‘registrations’ }

root’posts#index’
get “posts/index” => “posts

元記事を表示

docker-composeでpostgresのDBが永続化できていなかったのを直した

問題

今いるプロジェクトで、`docker-compose`で名前付きvolumeを使っているのにも関わらず、`postgres`のDBが永続化できませんでした。
なので、`docker-compose down`をするとDBが消えてしまい、`docker-compose up`した後にその都度`rake db:create`やら`rake db:migrate`をやりなおさないといけないという感じでした。

まぁ、そんな頻繁に`docker-compose down`しなければいいとはいえ、たまに`docker-compose down`した時にいちいちDBを作成しなおすのは面倒ですし、必要なデータが存在する場合はDBを削除できないので、誤って`docker-compose down`しないように気をつけないといけません。

余計な部分は省いていますが、当初の`docker-compose.yml`は以下のような感じでした。
( postgresのDBを永続化するために、名前付きvolumeを作成して、`postgres`コンテナ内の`/var/lib/postgres

元記事を表示

Rails コマンドがうんともすんとも言わないときの対処法

# 症状
`rails` コマンドを実行したときに、10 分以上待っても何も反応しないことがある。

“`shell:Shell
bundle exec rails generate scaffold blog title:string body:text
# 10 分以上待っても反応しない
“`

かといって、エラーが出るわけでもない。完全に止まっている状態になる。

# 対処方法
この場合、かなりの確率で Spring に原因がある場合がある。

Spring を一度ストップしてあげると正常に動くようになる。

“`shell:Shell
bundle exec spring stop
“`

“`
Spring stopped.
“`

これで `rails` コマンドが正常に実行できるようになる。

# 参考サイト
* [“rails generate” not working](https://stackoverflow.com/questions/23157426/rails-generate-not-working)

元記事を表示

【Rails】raty.jsを用いた星5レビュー機能の実装

## はじめに
プログラミング学習を始めて2ヶ月目になります。
学習したことを自分なりに解釈理解し、アウトプットできればと思いQiitaを始めてみました。

## 今回実装していく流れ

– 事前準備(jQuery、raty.jsの導入)
– 投稿フォームに星レビュー機能の追加
– 投稿の詳細画面での星レビュー表示
– 投稿の一覧画面での星レビュー表示

## 開発環境
– ruby 2.6.3p62
– Rails 6.1.4

## 前提モデル
![Bookers2のER図before.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2581621/8ee9b573-c28b-8982-34a1-2e1d35adea87.png)

# 〜事前準備〜

## 1. jQueryを導入
rails6では、yarnでjqueryをインストールしてください。
“`:ターミナル
yarn add jquery
“`
次に、webpackerの設定ファイルで、jQueryを管理下に追加す

元記事を表示

Rails7 ライブリロードとSCSS

## はじめに
Rails7を使う上でscss環境とライブリロードが欲しかったので実装した

## 環境
M1 Mac book
VSCode
Ruby 3.1.0
Rails “~> 7.0.2”, “>= 7.0.2.3”
Bundler version 2.3.3

## rails sまで

1. プロジェクトファイルを作成する
`mkdir sample`
2. ファイル内でbundleを初期化
`bundle init`
3. Gemfileを編集する(rubyの#を消してactiveにする)
4. gemのインストール先をローカルに設定
`bundle config set path ‘vendor/bundle’`
5. gemをインストール
`bundle install`
6. 新規Railsアプリケーションの作成
`rails new .`

## sassの導入
`./vendor/bin/bundle add dartsass-rails`
`./vendor/bin/rails dartsass:install`
**上記のコマンド2つでdart-sassを

元記事を表示

database.ymlを編集したらrails db:create RAILS_ENV=productionでエラーが出た話

# はじめに
1月〜プログラミングスクールで学習しています。
これから平日は~3/25まで毎日何かしらアウトプットのため投稿を続ける予定です。
今回はEC2内でデータベースを作成する際にdatabase.ymlを編集し、rails db:create RAILS_ENV=productionコマンドを実行した時に出たエラーについて書きます。

# 経緯
本番環境でRailsを起動させたく、本番環境のmysqlの設定に合わせるため、ローカルのdatabase.ymlを以下のように編集しました。(頭の中では。。。)
“`yml
production:
<<: *default database: diet_app_production username: root password: <%= ENV['DATABASE_PASSWORD'] %>
socket: /var/lib/mysql/mysql.sock
“`

その後、EC2にssh接続し、”rails db:create RAILS_ENV=production”を実行すると下記エラーとなりました。

元記事を表示

【Rails】Deviseでログイン機能の実装

# Deviseとは
ログイン機能の実装を簡単にしてくれるRubyのgemの1つ。
今回Railsの学習中に使用したので自分用のメモとしてまとめてみました。

# Devise導入
Gemfileに以下を追記します。

“`ruby:Gemfile
gem ‘devise’
“`

次にbundle installを実行します。

“`
$ bundle install
“`

以下のコマンドでRailsアプリケーションにDeviseを導入します(プロジェクトディレクトリ)。

“`
$ rails g devise:install
“`

# userモデルを作成
Deviseを用いてuserモデルを作成します(プロジェクトディレクトリ)。

“`
$ rails g devise user
“`
マイグレーションファイル(db/migrate/YYYYMMDDhhmmss_devise_create_users.rb)が生成されるので、
他に追加したいカラムがあればここに追記。

追記が完了しましたらマイグレーションを実行します。

“`
$ rake db:mi

元記事を表示

Railsで環境構築

今回Railsの学習中に使用したので自分用のメモとしてまとめてみました。
homebrewやrbenvの設定は終わっている想定です。

# Railsのインストール
以下のコマンドを実行します。
バージョンはプロジェクトに合わせて変更してください。

“`
$ gem install rails -v “5.2.3”
“`

インストールが完了したら以下のコマンドでバージョンを確認してみましょう。

“`
$ rails -v
“`

指定したバージョンが表示されればOKです。

# Railsアプリケーションの作成

Railsアプリケーションを新規作成していきます。
アプリケーションの新規作成には以下のコマンドを使用します。
アプリ名は仮に「sample」とします。

“`
$ rails new sample -d mysql
“`
上記のコマンドは `sample` という名前のRailsアプリケーションを作ります、データベース管理システムは `MySQL` で作ります、ということを意味しています。

# Railsアプリケーションへの移動・立ち上げ

先程作成した

元記事を表示

メソッドを呼び出す時、どんな処理が行われているのか

メソッドを呼び出すとき、どんなことが起きているのか理解するには2つのことを意識しないといけないんです。
➀メソッド探索
➁実際に実行する

それぞれ見ていきましょう
## ➀メソッド探索
メソッド探索とは、その名前の通り、メソッドを探すことです。
それを考える際に、**レシーバ**と**継承チェーン**という言葉が大事です。
例えば“`@books.each“`というコードがあった時、@books がレシーバとなります。呼び出すメソッドが属しているオブジェクトのことをレシーバといいます。
継承チェーンとは親クラスをたどって最終的にBasicObjectクラスまでたどってメソッドがあるかを探すことです。
イメージとしてはこんな感じです
“`
Object
↑superclass
Array
↑superclass
obj → Myclass
“`
objにたいしてメソッドが呼ばれたときにこの矢印の順にメソッドを探していきます。この図にはないですが、最終的にBasicObjectまでメソッドを探していきます。“`Myc

元記事を表示

Rails タグ編集・一覧・詳細機能とコードの解説

# コントローラの作成
“`posts_controller.rb
def index
@posts = Post.all.order(created_at: :desc)
@tag_list = Tag.all #ビューでタグ一覧を表示するために全取得。
end

def show
@post = Post.find_by(id: params[:id]) #クリックした投稿を取得。
@post_tags = @post.tags #そのクリックした投稿に紐付けられているタグの取得
end

def edit
@post = Post.find_by(id: params[:id])
@tag_list = @post.tags.pluck(:tag_name).join(‘,’)
end
def update
@post = Post.find_by(id: params[:id])
@post.content = params[:content]
tag_list = para

元記事を表示

7つのアクション以外のアクション

オリジナルアプリでグループ共有で使えるカレンダーアプリを作成中。

昨日マイページをルートパスに設定しようとしたところ、パラメーターはルートパスに設定するのは難しいと知り、急遽ルートパスの変更を余儀なくされた。
どんなページに遷移させようか考えた末、グループ登録のページをルートパスにしようと思いついた。

### やりたいこと
まず実装させたいことは、
①グループの新規作成ボタン(sign_in)
②既存グループで自信が未参加のグループへ参加するボタン(sign_up)
③自信が参加中のグループへログインするボタン
以上3点である。

そこで新たに行き詰まったのは、これらのボタンを実装させるためには、どういったアクションがベストなのか、ということ。

まずこのアプリを作る上で意識していることは「シンプルで使いやすいアプリ」である。
ユーザーにはできるだけクリックする回数や入力の手間を省きたいと考えている。
要は③を実装するにあたり、「eachメソッドを使って参加中のグループを一覧として表示させ、グループ名をクリックするだけで、該当ページへ遷移する」といった実装を行いたいわけである。

元記事を表示

Rubyのバージョンを変更した際のLoadError解決法

## 実現したいこと

Rubyのバージョンを変更した際に発生する、LoadErrorを解決したい✅
“`terminal:エラー文(抜粋)
`require’: incompatible library version
“`

## 解決法
結論から言うと、
“`vender/bundle/ruby/バージョン番号“`以下のフォルダを全削除して、“`bundle install“`すれば解決します!!!

## エラー発生→解決まで
その1 rubyのバージョンを変更
“`terminal:terminal
rbenv global バージョン番号
又は、
rbenv local バージョン番号
“`

その2 GemfileのRubyバージョンの書き換え&“`bundle install“`
“`ruby:Gemfile
ruby ‘バージョン番号’
“`