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

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

Mysql2::Error: Unknown database ‘app_development’が急に出た

## 環境
macOS Monterey 12.3
docker-compose 2.2.3
mysql 8.0
rails 6.1.4
rails初心者が突然のエラーに出会い、もうrails諦めようと思ったので、経緯を含めて書きました。
半日くらいでエラー解消。

## 困ったこと

アプリ作成中に突然エラーが出ました。
“`
Mysql2::Error: Unknown database ‘app_development’
“`

> app_developmentなんてデータベースありません。

かな?いや、今までずっと使ってたのに、、

[画像イメージ](https://rails-ambassador.herokuapp.com/debugs/NoDatabaseError)

## 試したこと

### 1. とりあえずコマンド打った
docker-compose exec web rails db:reset
docker-compose exec web rails db:migrate:reest
docker-compose exec web rails db

元記事を表示

Rails7 + Vite + React の環境構築

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

“`
$ mkdir app-name && cd $_
$ rbenv local 3.1.1
$ nodenv local 16.14.0
$ rails _7.0.2.3_ new -d postgresql –skip-asset-pipeline –skip-javascript –skip-hotwire –skip-jbuilder –skip-test .
“`

“`
$ git add .
$ git commit -m ‘rails new’ -m ‘rails _7.0.2.3_ new -d postgresql –skip-asset-pipeline –skip-javascript –skip-hotwire –skip-jbuilder –skip-test .’
$ git remote add origin https://github.com/github-user-name/app-name.git
$ git push -u origin main
“`

# Gemfile

元記事を表示

Rails 本番環境でmigrationファイルが反映されない

# 問題
本番環境のDBでrails db:migrateしても、データベースが変更されず、エラーが発生した。

# 解決方法
ENVを指定するだけで解決した。
“`
rails db:migrate ENV=production
“`

元記事を表示

deviseのログイン後、ログアウト後のリダイレクト先を設定する方法

# 環境

Ruby 3.0.2
Rails 7.0.2.3

# コード

“`ruby: app/controllers/application_controller.rb
class ApplicationController < ActionController::Base private # ログイン後のリダイレクト先 def after_sign_in_path_for(resource_or_scope) root_path #ここを好きなパスに変更 end # ログアウト後のリダイレクト先 def after_sign_out_path_for(resource_or_scope) new_user_session_path #ここを好きなパスに変更 end end ``` これだけです。 # 余談 ログアウト後の遷移先は設定必要だと思いますが、 ログイン後の遷移先は、例のように `root_path`にするならば、そもそも `config/routes.rb`で設定してあるので不要だと思います。 ```r

元記事を表示

【Nokogiri】スクレイピングして複数ある要素の最初の1つを取得したい

# 状況

Nokogiriでスクレピングしてogp情報を取得したところ、
対象のサイトのog:imageが複数あったため、
結果が複数URLを連結した文字列となってしまった。
(連結した文字列になったのは私のせいです…)
一つ目のURLだけ欲しいのに!!
という時です。

# 結論

`at_css`を使う。です。
“`
html = open(‘nokogiri_practice.html’).read
doc = Nokogiri::HTML.parse(html)

doc.at_css(‘//meta[property=”og:image”]/@content’)
“`

# at_css, css
`at_css`と`css`はcssセレクタで指定した要素を取得するメソッドです。

## at_css
`at_css`は複数ある要素のうち、最初の要素を取得してくれます。
指定の要素がない場合は`nil`を返します。

## css
`css`は指定した要素を配列型式で全て取得してくれます。
指定の要素がない場合は空の配列を返します。

### 参考
[RubyでWe

元記事を表示

【Rails】カレンダーの月めくりajax化

# 環境
Ruby 2.6.3
Rails 5.2.6
本番環境 Nginx/Puma/Linux2/AWS EC2/MySQL

# この記事でわかる事
simple_calendarを実装させましたが、月を翌月や先月に切り替えるとリロードをしてしまうので
カレンダーのみ非同期で更新させる方法を解説します。

※simple_calendarの実装は以下記事を参考にさせていただきました。
[【rails】simple_calendarを使ってカレンダーつきのブログ機能を作ってみた。](https://qiita.com/isaatsu0131/items/ad1d0a6130fe4fd339d0?)
[【Rails】simple_calendarを使ってカレンダーつきのmemo機能を作る。](https://note.com/yukinooffice/n/n36789d96ba5d)
# 実装方法
## 非同期処理のざっくり手順
1. 更新トリガーを `remote :true`にする
1. 更新させたいviewを部分テンプレート化する
1. アクション名.js.erbファイルを作

元記事を表示

【Docker】Rails API + Reactの環境構築

## はじめに
 本記事は、プログラミング初学者、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
 そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
 間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## DockerでReactの開発環境を構築する方法
### Docker-compose.yml

“`docker-compose.yml
version: ‘3.9’

services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: passwordadmin
MYSQL_DATABASE: mydb
MYSQL_USER: root
MYSQL_PASSWORD: passwordadmin
TZ: ‘Asia/Tokyo’
command: mysqld –character-set-server=utf8mb4 –collation-

元記事を表示

cancancanのテストをRSpecで書く

cancancanを使った際、テストに学びがあったので投稿します。

# 前提:cancancanとは

権限による制御が簡単にできるgemです。
– [cancancan](https://github.com/CanCanCommunity/cancancan)
– [Rails|CanCanCanの使い方解説](https://weseek.co.jp/tech/1211/)
↓私も1つ記事を書きました。
– [cancancanでモデル名に紐づかない制御をする方法](https://qiita.com/m-ito27/items/784f22bec151cc2f1e28)

# cancancanのテスト
requestスペックなどで特定の権限が各アクションを実行できるかどうかをテストする方法もあると思いますが、今回はcancancanが用意しているmatcherを使ってテストする方法を紹介します。

– 参考
https://github.com/CanCanCommunity/cancancan/blob/develop/docs/testing.md

“`ruby:a

元記事を表示

docker-composeで環境変数が読み込めないときの対処法。[WARNING: The MYSQL_ROOT_PASSWORD variable is not set.]

Rails(API) + MySQL + Reactという構成でポートフォリオを作成する中で、ローカルで開発したものをコンテナに入れて動かす際に環境変数関係でハマりました。

原因は簡単なことでしたが、解決までかなりの時間がかかったため、その道のりを記録に残しておきます。

## 前提条件
・macOS Monterey v12.1
・ruby 3.0.3
・Rails 6.1.5
・MySQL 8.0.28
・Docker 20.10.12
・Docker Compose v2.2.3

## やりたいこと
`docker-compose.yml`で`.env`に記載した環境変数を読み込みたい。
“`yml:docker-compose.yml
version: ‘3’

services:
db:
image: mysql:8.0.28
volumes:
– ./etc/my.cnf:/etc/mysql/conf.d/my.cnf
– hanger-talk_data:/var/lib/mysql
environment:

元記事を表示

Deviseで特定のステータスのユーザーにログインさせない方法とエラーの日本語化(Rails)

Deviseを使っていたRailsアプリケーションで、ログイン情報としてIDとパスワードとは別に、**特定の条件をユーザーが満たす場合にそのユーザーのログインを許可したくない**場面があり、その際の制御と日本語表示を学んだので備忘として記載します。

# やりたいこと
ユーザーはメールとパスワードでログイン可否の認証を行なっている。
しかしながら、ユーザーテーブルにはロック状態かどうかを判定するカラムがあり、ユーザーがロックされている場合にはログインさせたくない。
また、エラーメッセージを日本語化したい。

## 1. ユーザーにログインさせない方法

結論:Deviseが用意している[`active_for_authentication?`メソッド](https://github.com/heartcombo/devise/wiki/How-To:-Customize-user-account-status-validation-when-logging-in) を使う

“`ruby:user.rb
def active_for_authentication?
super &

元記事を表示

rails6 Bootstrapテンプレートでのエラー

こちらは、私がBootstrapのテンプレートを使用した時につまづいたエラーについて紹介します。

# 環境
ruby 3.0.2
rails 6.1.4
bootstrap 5.0.0-beta3
popperjs 2.10.2
webpacker 5.0

# エラー内容
bootstrpのテンプレートをインストールし、ダウンロードしたフォルダやファイルを自分のアプリに組み込んでいきます。
その時に、stylesheetsフォルダーに必要なcssやscssのファイルも一緒に移行しました。
そして、ローカルにアクセスして見たところ、
“`
Sprockets::DoubleLinkError
“`
こちらは、「同じ出力パスを持つ複数のファイルをリンクできない」というエラーのようでした。

# つまづいたポイント
Rails6からwebpackerがデフォルトでインストールされるようになりました。
webpackerでは、cssファイルではなくscssファイルを使用することでスタイルの編集が可能になります。
なので、stylesheetsフォルダー中にcssファイルかscssファイ

元記事を表示

annotate_modelsを導入したのにアノテーションが動かなかった

# 環境
Ruby 3.0.2
Rails 7.0.2.3

# Annotate models

モデルファイルなどに、↓のようなマイグレーションの内容を自動で書いてくれるツール

“`ruby
# == Schema Info
#
# Table name: line_items
#
# id :integer(11) not null, primary key
# quantity :integer(11) not null
# product_id :integer(11) not null
# unit_price :float
# order_id :integer(11)
#

class LineItem < ActiveRecord::Base belongs_to :product . . . ``` [ここ](https://github.com/ctran/annotate_models#install)を参考

元記事を表示

rspecの導入手順 json コントローラテスト

## 序文

RSpecを初めて使ってみましたので手順を残します。

## Gemfileにrspecを入れましょう
“`
group :development do
gem ‘rspec-rails’
end

“`

## specファイルを作りましょう
“`
rails g rspec:controller the_dog

“`

## テスト環境設定

テスト環境の設定ができているか見直しましょう
例)
– config/database.ymlにテスト用のDBを指定
– config/test.yml.encの追加
– config/settings/test.yml
– rails db:environment:set RAILS_ENV=test

“`
require ‘rails_helper’

RSpec.describe Api::V1::TheDogController do # コントローラ名
render_views
describe “GET /index” do
it do
request.env[“

元記事を表示

バージョン指定で”rails new”したら”Gem::GemNotFoundException”でコケたとき用

# そもそも
– 現場Railsの3章、”taskleaf”アプリケーションの準備段階で躓く(バージョン指定でnewが出来ず)
– バージョン指定での”rails new”以外の方法があるっぽいので実践してみたログ

# 手順
#### アプリのディレクトリを作成する
“`
mkdir hoge
“`

#### ディレクトリに移動
“`
cd hoge
“`

#### bundle initする
– (これ要るのか?要調査)
“`
bundle init
“`

#### できたGemfileにRailsのバージョンを書き込む
“`rb:Gemfile
gem “rails”, ‘5.2.1’
“`

#### bundle installする
“`
bundle install
“`

#### Rails new(質問にはYで答える)
“`
$ rails _5.2.1_ new . -d postgresql –skip-bundle
“`

#### Gemfileのsass-railsのバージョン指定を外す
– 次にbundle installす

元記事を表示

Rubyにおけるインスタンスメソッドとクラスメソッドの違い

用語の違いは以下になります。

“`ruby:qiita.rb
class User
# これがインスタンスメソッド
def hello
p “hello”
end

# これがクラスメソッド
def self.hello
p “hello”
end
end
“`

selfが付くやつがクラスメソッド。完

元記事を表示

Rubyにおけるprivateメソッド

privateメソッドについて全くわからなかったので簡易的にまとめました。

以下の場合、クラスの外から呼び出しているのでエラーになる。
“`ruby:sample.rb
class User
private

def hello
puts ” ハローワールド”
end
end

user = User.new
user.hello
“`
つまり作成したインスタンスからは呼び出せないのです。

ということで、次のようにクラス内で、privateメソッドを呼び出すメソッドをあらたに定義する。
そして新たに定義したメソッドを実行。

“`ruby:sample2.rb
class User
def say
hello
end

private

def hello
puts ” ハローワールド”
end
end

user = User.new
user.say
“`
つまり、privateではないメソッドを一枚挟んだらいいということでした。完

元記事を表示

find_or_initialize_byとfind_or_create_byについて

## 2つのメソッドの違い
Railsを勉強していく中でこの2つのメソッドに遭遇したのでそれのアウトプットをしていこうと思います。

結論からいうと、**新規作成した後保存するかしないか**が違いです。

| メソッド名 | 挙動 |
|:-:|:-:|
| find_or_initialize_by | 新規作成した後保存しない |
| find_or_create_by | 新規作成した後保存する |

恐らく使い道は、送信フォームで戻るボタンを実装する際に使われたりするのかなとおもいます。

【参考文献】

https://qiita.com/taimuzu/items/0a21738d018f475d63ae

元記事を表示

I18n::InvalidLocaleエラーについて

今回ツイート機能の投稿日時を以下の手順で日本時間に設定したところ、
deviseの新規登録時の生年月日入力欄でエラーが発生した。

原因としてはもともとen.yml(英語)で設定されていたのにも関わらず、
ツイート時間を無理やりja設定にしてしまったのが理由でエラーが出てしまったと推測する。

ツイート時間変更時に行なった作業
①config/application.rbを以下のように設定
“`config/application.rb
module TimeFormatSandbox
class Application < Rails::Application # ... # デフォルトのロケールを日本(ja)に設定 config.i18n.default_locale = :ja end end ``` ②次に表示したいhtml上を以下のようにlメソッドを使用するための設定をした ```index.html.erb <%= l user.created_at %>

“`
“`config/locales/ja.yml
ja:

元記事を表示

Stimulusを使ってドラッグ&ドロップでファイルアップロード

Rails で input[type=file] の入力欄にファイルをドラッグ&ドロップして選択する機能を追加しようと調べてみたのですが、script 要素にべた書きの実装例しか見つからなかったので、Stimulus を使った実装をしてみました。

# 環境

+ Ruby 3.1.1
+ Ruby on Rails 7.0.2

# View

既存のページには、data-controller 属性と data-action 属性と data-*-target 属性を追加するだけなので、ほとんで手を入れずに済みます。

Stimulus 側に file_drop という名前のコントローラを作るので、data-* 属性の値や名前もそれに合わせます。

“`erb:app/views/users/_form.html.erb

warning: constant Gem::ConfigMap is deprecated

# warning: constant Gem::ConfigMap is deprecated

## 初めに
先日他の人のrubyのプロジェクトと`git clone`でクローンしコードをレビューする機会があり、その際に表示されたエラーについて書いていこうと思います。

## 原因
rubygemのバージョンが遅れていることによって起きるエラー

## 解決方法

rubygemを入れ直してあげてバージョンを変えてあげればok
“`
$ gem uninstall rubygems-update
$ gem install rubygems-update -v=2.7.6
$ update_rubygems
“`

元記事を表示

OTHERカテゴリの最新記事