Rails関連のことを調べてみた2020年11月23日

Rails関連のことを調べてみた2020年11月23日
目次

プルダウンを使おうとするとエラーになる件

##ActiveRecord::StatementInvalid

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888181/cee83ef1-d0b5-4ea8-c081-a29ba6ac4f47.png)

他のf.text_areaは使えるのに、、テーブルがないよと言ってますね。
いちよマイグレの確認upにされてるし、カラムも間違えてないのに。。。
datebase.ymlいじっても変化なし。

##ActiveHash::Base

ActiveHash::Baseは、あるモデル内(クラス内)でActiveHashを用いる際に必要となるクラスです。ActiveHashのGemに定義されています。
また、ActiveHash::Baseを継承することで、ActiveRecordと同じようなメソッドを使用できる

“`model/category.rb
class Category < ApplicationRecord include ActiveHash::Asso

元記事を表示

ルーティングにおける、getとpostの使い分け (Ruby on Rails)

(学習備忘録)

Ruby on Railsのルーティングにおける、getとpostの使い分け

「get」
データベースを変更しないアクション

「post」
データベースを変更するアクション

元記事を表示

スクール4週目 学習環境の大切さ

スクール4週目では、問題をときながら一つずつ実装していくChatAppを完了することができました。
#学習環境の大切さ :satellite:
プログラミング学習時に皆さんは音楽を聴きますか?集中力を高める為や、気分を上げる為に聴く方は多いと思います。私は学習中、常にイヤホンで自然音を流しています。

自分はこれまで自然音を流しながら学習する習慣はなく無音で学習しては周りの雑音が気になり、集中が途切れることが多々ありました。ところが、自然音を流しながら学習をするとプログラミングに没頭できることを実感しています。

これは、一定のテンポで自然音を流すことでリラックス効果あるからだと思います。また、ポモドーロ・テクニックを活用して25分勉強して5分休憩するを繰り返すことで、集中力を維持できます。ぜひ、一度は実践をしてみてください。

#応用カリキュラム :bulb:
・ユーザー管理機能実装
・グループ作成編集機能実装
・メッセージ送信機能実装
・テスト
・非同期通信機能実装
・自動更新機能実装

**ユーザー管理機能実装** :man_tone1:
gemのdeviseを使用してのユーザー

元記事を表示

【Rails】2つの(複数)deviseを導入

#はじめに
「ユーザーと業者」、「管理者とユーザー」、「先生と生徒」など、登録情報が2つ以上(複数)必要な場合、deviseも同様に2つ以上(複数)必要です。
2つの(複数)deviseの導入方法を紹介します。

###目次
1. deviseのインストール
2. モデルを作成
3. ルーティングの設定
4. コントローラーの作成

##開発環境
ruby 2.6.5
rails 6.0.0
devise 4.7.3

#実装
それでは実装していきます〜

#1. deviseのインストール

deviseのgemを導入します。

“`Gemfile.
# 中略
gem ‘devise’
“`

記述したら、bundle installを実行しましょう。

“`ターミナル.
bundle install
“`

Gemをインストールした後はrails sをcontrol + Cで一度停止し、サーバーを再起動する必要があります。

続いて、アプリケーション内でdeviseを使えるようにするため、下記のコマンドを実行します。

“`ターミナル.
rails g devise

元記事を表示

コントローラーのテスト時に画像をアップロードする方法

RSpecでコントローラーの単体テストを行っていた時にエラーが発生したため、解決方法を記録として残します。

## 開発環境
– rails (6.0.3.3)
– rspec-rails (4.0.1)

## コード内容
店舗情報の登録に関するテストを行いました。

“`ruby:laundries.spec.rb

context “管理者の場合” do
before do
@user = FactoryBot.create(:user, admin: true)
end

it “店舗情報を追加できること” do
laundry_params = FactoryBot.attributes_for(:laundry)
sign_in @user
expect {
post laundries_path, params: { laundry: laundry_params }
}.to change { Laundry.count }.by(1)
end
“`

内容としては、
1

元記事を表示

ActionMailer実行時にletter_openrが原因で落ちた

##表示されていたエラー
“`Launchy::CommandNotFoundError Exception: Unable to find a browser command. If this is unexpected, Please rerun with environment variable LAUNCHY_DEBUG=true or the ‘-d’ commandline option and file a bug“`

##経緯と概要
vagrantがどうこうという記事ばかりで参考になるものが決め打ちでなかなか見当たらなかった為、次回同じ原因でハマった時用の備忘録。
結論、EC2でリモート開発するなら、letter_openerではだめで、letter_opnener_webを使わないといけない。

“`ruby
HogeMailer.hoge(huga).deliver
“`
みたいな感じのパターンで落ちてて、上記エラー出てるなら疑うべき。

##環境
Rails 4.2
Ruby 2.3
letter_opener 1.4.1
EC2に内にソースコードを

元記事を表示

最低限のゲストログイン機能を作った

#はじめに
 ポートフォリオの作成にあたり、採用担当者さんに少しでも見ていただけるように、ゲストログイン機能を実装した。

##流れ
1. ルーティング記述
2. ゲストの情報をモデルに記述
3. コントローラーにアクションを記述
4. ビューを記述

流れは機能を実装するときとほぼ同じ。

###1. ルーティング記述
“`ruby:routes.rb
devise_scope :user do
get ‘users/guest_sign_in’, to: ‘users/sessions#new_guest’
end
“`
URIはわかりやすく、正規のユーザーログインと同じような感じで。
アクションは、deviseのコントローラーに記述するので、`sessions`コントローラーを指定。

###2. ゲストの情報をモデルに記述
“`ruby:user.rb
def self.guest #ゲストユーザー用のアカウント作成
find_or_create_by!(email: ‘guest@example.com’,

元記事を表示

FactoryBotでポリモーフィックなアソシエーションを生成する

#はじめに
FactoryBotを書いてて、ポリモーフィック関連を自動生成するにはどうしたらいいんじゃ!
と思って調べたので、忘備録です。

#やりたいこと
例えばツイッターのようなアプリを作ることを考えて、Postテーブルを作ることにします。Postテーブルには投稿主を表すpostable_idがあるとします。
投稿できるのは、一般のUserの他に別テーブルで管理されてるCompanyも投稿できるようにしたとしましょう。すなわちUserとCompanyはPostとポリモーフィックな関係で結ばれています。

“`
User —-|
|—- Post
Company–|
“`
この時、postを生成するのと同時にuserやcompanyをFactoryBotで自動的に生成する方法を説明します。

#解決
では 早速コードをみてみましょう。
まずは、デフォルトで用意されてるかもしれませんが、userとcompanyを作成するファクトリを用意します。

“`factories/users.rb
FactoryBot.define do
factory :

元記事を表示

Rails初心者がRSpecに入門してみた 2

[前回](https://qiita.com/grinch1252/items/c1b94cbfeecffe2a56d5)

大分間が空いてしまいましたが、前回からの続きでテストの記述方に触れていきます。

#RSpec記述の基本形
“`
‘rails_helper’

RSpec.describe “テストする対象”, type: :Specの種類 do

describe “どのような機能” do

before do (以下のテストを確認するために必要な用意)
(事前準備)
end

context “どのような状況/条件で” do
(具体的な条件)
it “どのような結果を期待する” do
(具体的な結果/処理)
end
end
end
end
“`

基本的には上記のような形になると思います。

describeはテストしたい機能、contextはif文のような条件分け、itはそれに対して期待する結果を記述します。before doは必要であればテストをする以前に必要な処理、例えば

元記事を表示

TECH CAMP (エンジニア転職)7週目の学習内容の振り返り

みなさんおつかれさまです。今週やっとテックキャンプの最終課題が終わったので、明日から自分のポートフォリオの作成に入ろうと思います。ではでは、振り返りをやっていこうかと思います。

11/16~11/22までの学習進捗
・商品詳細表示機能の導入
・商品情報編集機能の導入
・商品削除機能の導入
・商品購入機能の導入

正直いって詳細表示、編集、削除機能に関しては、そんなに難しくなかったですが、購入機能は結構な工数が必要になり、時間は結構かかりました。いつもならそれぞれの項目でどんなことをやったのかを書いているのですが、フリマアプリの商品情報に関する機能はそこまで難しくない上、文章として残しておけるほどの情報量を思い出せないので割愛しておきます(笑)。

・購入機能の導入
まず始めに、大まかに手順が必要だったのかを箇条書きで書くと、
・テーブルの作成(購入履歴と配送先の情報をDBに記録)
・フォームオブジェクトパターンの実装
・決済機能の導入
・テストコードの実装
・購入機能実装によるビューファイルの編集
という感じですね

最初にやるテーブル作成では、2つのテーブル(購入履歴と配送先)が必

元記事を表示

[Rails]respond_toについて勉強してみた!![初心者]

#respond_toメソッドとは?
URLにアクセスする際に、リクエストされるフォーマット(HTMLやJSONなど)ごとに、処理を分けることができるメソッドです。
リクエストのフォーマットは、URLの最後に拡張子(htmlやjsonやjs等)をつけることで、指定することが出来るものです。

普段、インターネットを利用する時に、わざわざ拡張子まで意識して利用している人は少ないと思いますが、特にフォーマットの指定がなかった場合は、デフォルトのHTML形式で送信されます。

近年に入り、Web APIでJSON形式のデータを扱うことも増えたので、このメソッドを目にする機会も多くなりました。

つまり、通常はHTML形式で結果を取得できているのですが、明示的に他のフォーマットを指定された場合に備えて、この“respond_toメソッド“を使用しましょう、ということです。

#使い方
まずは基本構文から確認しましょう。

““
respond_to do |format|
format.形式 {行いたい処理}
end
““

↑のように記述します。

#具体的な使用例

“`

元記事を表示

Railsアプリのデプロイで「応答時間が長すぎます。」のserver errorに出くわした話

#概要

Railsアプリを本番環境(AWS/EC2)にデプロイしようとIPアドレスでサーバーへ接続した際、「このサイトにアクセスできません。●●(IP),応答時間が長すぎます」とのエラーで長時間ハマったため、備忘録 兼 同じ境遇の方の参考になればと思い投稿しました。

#結論 : config.force_ssl = true を有効にしていたのが原因

“`ruby:qiita.rb
config.force_ssl = true
“`

元記事を表示

Rspecレスポンス確認方法

### 背景
テスト作成時、わざわざ手作業でアプリ動作させてログ上で正しいレスポンスを確認したり、
テストの途中binding.pryでブレークポイントを仕掛けて確認したりしていた…

### ここに書くこと
1. テストを走らせたときにDB処理やrollback等のログを一緒に表示してくれる方法
2. コンソール上でリクエストを送信してアプリ上で行われる処理を確認する方法

#### 1. テスト実行時ログを標準出力(STDOUT)する方法
“`rails_helper.rb
Rails.logger = Logger.new(STDOUT) #railsのログ出力
ActiveRecord::Base.logger = Logger.new(STDOUT) #SQLのログ出力

RSpec.configure do |config|
・・・
“`

#### 2. コンソール上でリクエスト送信してレスポンスを確認する方法

##### `appメソッドでappオブジェクトにアクセス`

“`
# サインインページを訪れて、トークンを発行する(CS

元記事を表示

AWSのEC2インスタンスにカラム名の変更が反映されているのに変更前のカラム名がunknown attributeだというエラーが出る

## 起きたこと
データベースのカラムを変更するため、マイグレーションファイルを書き換えました。
その後、自動デプロイツールであるCapstranoでデプロイを更新しました。
動作を確認したところ、カラムを変更したフォームに入力する画面に遷移しようとした時に、unknown attributeというエラーが出ました。

## 結論
teratailで質問をしたところ「アプリケーションサーバーの再起動はできているのか」とアドバイスいただきまして、Unicornのプロセスを確認したところ起動していませんでした。
Uniconが起動していなかった原因はわかりませんが、起動したところエラーがなくなり変更したカラムにも値が保存されるようになりました。下の図のようにアプリケーションサーバーが起動していなかったため、ビューなどは表示できたが、処理を行ったりDBへアクセスができずエラーになったと考えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693815/7715dddd-f64c-812d

元記事を表示

Rails 子レコードの作成・更新時に親レコードのupdated_atも更新する

こんにちは。
初めて記事を投稿してみます。

Railsで子レコードを作成・更新時、親レコードのupdated_atも更新したい時
ActiveRecordの関連付けで、touchオプションを使えば簡単にできること知ったので
備忘のためにまとめてみます。

##touchオプション

Railsガイドより
>:touchオプションをtrueに設定すると、そのオブジェクトがsaveまたはdestroyされたときに、関連付けられたオブジェクトのupdated_atタイムスタンプやupdated_onタイムスタンプが常に現在の時刻に設定されます。

“`ruby
class Shop < ApplicationRecord has_many :reviews end class Review < ApplicationRecord belongs_to :shop, touch: true end review = Review.last review.update( title: "いいお店") => # review.shop.updated_atも更新する
“`

#

元記事を表示

【Rails6】Railsの既存アプリをDockerizeする【Docker】

# はじめに

__Hello,Qiita__! :sunny:
今回は既存のRailsアプリをDockerに乗せてみようと思います!
コンテナの中に環境を移すというシンプルなものですが、
webpackやyarnのインストールで少し引っ掛かったので、記事にしてみました!
docker-composeでRailsとMySQLの2つのコンテナをオーケストレーションしてみましょう:musical_score:
それではいきましょう!!:whale2:

# 前提条件

– OS: MacOS
– Ruby: 2.7.1
– Rails: 6.0.3
– データベース: MySQL
– Docker: 19.03.13

# Dockerfileの記述
以下のように記述します。

“`dockerfile:Dockerfile
FROM ruby:2.7.1

ENV BUNDLER_VERSION=”2.1.4″ \
APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn \
TZ=Asia/Tokyo

RUN apt-get u

元記事を表示

lメソッドで時刻の表示が指示通りできない

## 起きたこと
https://qiita.com/jnchito/items/831654253fb8a958ec25
に従い設定をしました。
しかし、ja.ymlのdefaultをいくらいじってもブラウザに指示通りの表記がされませんでした。

“`ruby:ja.yml
ja:
time:
formats:
default: “%Y/%m/%d”
“`

## 結論
ja.ymlファイルの中に2つja:の塊を作っていたことが原因でした。
もう一つのja:の塊とは別のことも記述していました。具体的にはエラー時に表示されるカラム名を日本語に変換するためのデータです。

“`ruby:ja.yml改善前
ja:
time:
formats:
default: “%Y/%m/%d”
ja:
activerecord:
attributes:
user:
nickname: 名前
grade_id: 段位
email: Email
password: パスワード

元記事を表示

【初学者向け】単体テスト・機能テスト・統合テストを書こう【Rails Tutorial】

#経緯
先日RailsTutorialを修了し、自分でコードを書き始めた途端にテストを書かなくなってしまいました。
これは非常に良くないと思ったので、勉強した内容について簡単にまとめておきます。

#この記事で(多分)わかること
– テストを書くことのメリット
– RailsTutorialに登場する単体テスト・機能テスト・統合テストの違い
– それぞれのテストが何を対象としているか、どんなテストを書けばいいのか

#テストを書くことのメリット

まずは勉強のモチベーションを上げるために、テスト自動化ができると何が嬉しいのかを調べました。
>
####1. テスト作業の効率化と工数の削減
テストを手動で行っていた工数を大幅に削減し、開発に時間を割けるようになる。
リアルタイムでテストを実行できるため、誤ってコードを改変したときにどこが悪かったのか即座に検知できる。
####2. テスト作業におけるヒューマンエラーの排除
機械が何度でも正確にテストを繰り返してくれるため、人的ミスを排除することができる。
####3. 手動では実現できなかったテスト作業を実現
「数万件の同時アクセス

元記事を表示

[Rails]dry_validationでドライなバリデーションを構築

# dry-validationて?

railsでのバリデーションをdryにやってくれるgemです。
備忘録として残しておきます。
https://dry-rb.org/gems/dry-validation/1.5/schemas/

# 導入

“`:Gemfile
gem ‘dry-validation’
gem ‘dry-struct’
“`

# 設定

“`
class ApplicationContract < Dry::Validation::Contract config.messages.default_locale = :ja config.messages.backend = :yaml config.messages.load_paths << 'config/errors.yml' end ``` # バリデーションエラー時のメッセージ キーとバリューはyamlに記載します。 ```:config/errors.yml ja: dry_validation: errors: str?: '文字列ではない'

元記事を表示

本番環境のコマンドを開発環境で実行してしまった場合の対処

#はじめに
今回は本番環境で行うコマンドを間違って開発環境で実行してしまいエラーが発生してしまったのでそうなってしまった理由や原因を調べていきます。

##やってしまったこと
AWSでEC2のサーバーを立ち上げるために以下のコードを誤って開発環境で実行してしまった…

“`
$ bundle install –path vendor/bundle –without test development
“`

そこから`bundle install`やサーバーを立ち上げようとするとエラーが発生するようになりました。

bundle installで`Nokogiri`がインストールできないエラー

“`
Gem files will remain installed in
/home/vagrant/work/SMB/vendor/bundle/ruby/2.5.0/gems/nokogiri-1.10.9 for inspection.
Results logged to
/home/vagrant/work/SMB/vendor/bundle/ruby/2.5.0/ext

元記事を表示

OTHERカテゴリの最新記事