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

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

rails db:migrateが失敗!

##rails db:migrateを実行した際のエラー

`rails db:migrate`を実行すると
以下のエラーが出ました!

“`
StandardError: An error has occurred, all later migrations canceled:
“`
直訳すると以後の全てのマイグレーションでエラーが発生しキャンセルされましたという内容です。

更に、こんなエラーも出ています。

“`
Mysql2::Error: Specified key was too long; max key length is 767 bytes
“`
こちらのエラーは指定したキーが長すぎるためエラーが発生しているようです。
maxのkeyの長さは767bytesのようです。

##今回のエラーの仮説
keyの長さがmax767バイトなのに対し、keyが長すぎたためエラーが発生しているようです。

railsでデフォルトで生成される255文字のVARCHER型の場合、

◎**utf8mb4は1文字4バイト**、
255×4バイト= 1020バイト
 
767

元記事を表示

RSpecでCSVの値をチェックする

今参画しているプロジェクトでCSVのRSpecは

“`Ruby
expect(csv).to have_content(‘value’)
“`
のような形で書いていたのですが行毎の値を確認する必要が出てきたのでいろいろ調べていたんですが地味に検索で出てこなかったのでメモ。

以下のようなcsvを想定

|column_0 |column_1 |
|—|—|
|value_1 |value_2 |
|value_3 |value_4 |

“`Ruby
it ‘example’ do
csv_content = Sample.csv_content
csv = CSV.parse(csv_content)
# [行番号][列番号]
expect(csv[0][0]).to eq ‘value_1’
expect(csv[0][1]).to eq ‘value_2’
expect(csv[1][0]).to eq ‘value_3’
expect(csv[1][1]).to eq ‘value_4’

# 行毎に比較もできる

元記事を表示

【Rails】アソシエーションされたモデルのエラーメッセージ日本語化

railsでエラーメッセージを日本語させている時にちょっと沼ったので忘れないように書いておきます。

### アソシエーションされたモデルに日本語を渡せない

こちらの投稿を参考にさせてもらい、エラーメッセージの日本語化を行いました。
[Railsのバリデーションエラーのメッセージの日本語化](https://qiita.com/Ushinji/items/242bfba84df7a5a67d5b)

.ymlファイルを作成し、カラム名に日本語を渡していく中で思った通りの動きをしない部分が出ました。
![スクリーンショット 2020-08-25 9.39.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629679/e7731e4c-7783-cc04-1729-713e146666ec.png)

記述したコードはこんな感じです。

![スクリーンショット 2020-08-25 9.40.14.png](https://qiita-image-store.s3.ap-northeast-1.am

元記事を表示

devise(GEM)の適用時のエラー

ルーティングのエラーが発生

Routing Error
No route matches [GET] “/”
(以下略)

で、パスが見つからないと言う指示だけどroutes.rbにしっかり書いてる。
routes.rbを書き直しようがないのでよくわからなかったけど、deviseを適用するとき、と言うよりgemをインストールするときのrailsサーバーを一度再起動していなかったらしく、サーバーを再起動したら直った。

元記事を表示

Rails 本番環境でデータベースをリセットしようとしたら

##この記事について
SQLを勉強し始めて試しに本番環境でデータベースをリセットしようとしたら、エラーが出るようになって色々焦ったので備忘録として投稿

##環境
Ruby 2.6.6
Rails 6.0.3.2
AWS/本番環境(EC2, RDS, VPC, EIP, Route53, IAM, S3)

##データベースを消す
「本番環境でデータベースをリセットしたい場合」という文を見て、興味本位に以下のコマンドをアプリディレクトリで実行すると本番環境でエラーが出るようになった。

“`ruby:qiita.rb
$ RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rails db:drop
“`

エラーが出た理由は単純でデータベースがなくなってしまったから。

##rails db:setupを実行
`rails db:setup`はデータベースの作成、スキーマの読み込み、シードデータを用いてデータベースの初期化してくれるコマンドらしいが、実行すると以下のエラーが吐かれた。

`

元記事を表示

【rails g.error】

◆ファイル作成時のスペルミス
・rails g model massege
上記でmodelでファイルを作成。

その後、コントローラーで初期値の設定をできていないとエラーになり、プログラミング初心者の私は7時間かかって解決できませんでした。
次の日、通っているプログラミングスクールのメンターさんに解決していただきました。

◆rails gでファイル名を指定して作成する時はスペルミスをするととんでもないことになりました。
qiitaで書くブログの情報発信らしい内容はまだまだ書けていませんが、有益な情報を発信できるように頑張って学習していきます。

元記事を表示

【Railsチュートリアル】総合テスト

# 総合テストとは
アプリケーションの一連の動作を端から端までシュミレートできるもの

# 作成方法
テストのテンプレートは以下のコマンドで作成可能

“`:コンソール
rails generate integration_test テスト名
“`

# HTMLの構造を調べて、レイアウトの各リンクが正しく動くかどうかチェックする

1. ルートURL(Homeページ)にGETリクエストを送る。=>**getメソッド**
2. 正しいページテンプレートが描写されているかどうか確かめる。=>**assert_templateメソッド**
3. Home,Help,About,Contactの各ページへのリンクが正しく動くか確かめる。=>**assert_selectメソッド**

元記事を表示

【Railsチュートリアル 5章】レイアウトを作成する

# ナビゲーション
すべてHTMLはクラスとidの両方を指定することができる。
これらは単なるラベルであり、CSSでスタイルを指定するときに使用する。

**クラスとidの違いはクラスはページ内で何度でも使用できるが、idは一回しか使用できない点です。**

下のheaderタグには、navbar, navba-fixed-top, navbar-inverseという3つのCSSクラスがスペース区切りで与えられています。

“`erb

元記事を表示

[Rails6 / jQuery導入] Uncaught TypeError: $ is not a function のエラー解決

#開発環境
Ruby 5.2.1
Rails 6.0.3.2

#はじめに
rails 5の頃はgemを使ってjQueryをインストールしていましたが、
rails 6からはWebpackerを用いてjQueryをインストールするようになりました。

[Rails6でjQueryの導入方法](https://qiita.com/masahisa/items/eaacb0c3b82f4a11fc13)
[Introducing jQuery in Rails 6 Using Webpacker](https://www.botreetechnologies.com/blog/introducing-jquery-in-rails-6-using-webpacker)

このあたりの記事を参考に導入していきましたが、このようなエラーが…。
![スクリーンショット 2020-08-23 8.42.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686617/ef152bd5-4058-daf9-b5a0-

元記事を表示

【Ruby】each_with_indexとsearchを組み合わせたプログラム・考え方

アウトプット用に記します。
`macOS Catalina10.15.6にインストールしたRuby 2.6.5を使用。`
#やりたいこと#
数を探して何番目に含まれているか結果を返すメソッドを**search**と**each_with_index**を用いて作成したいんよね。

###まずこういう配列があるたいな###
“`
input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
“`
###んで、こんな感じに使えるsearchにしたいわけたいな###
“`ruby

search(12, input)
=> 4番目にあります

search(7, input)
=> その数は含まれていません
“`
###each_with_indexについて###
**each_with_index**はRubyに標準で組み込まれているメソッドの1つたいね。要素の繰り返し処理と同時に、その要素が何番目に処理されたのかも表せるんよ。

“`ruby

#each_with_indexの使い方

配列名.ea

元記事を表示

herokuへアップロードできない

#環境
・Rails 6.0.3.2
・mysql Ver 14.14 Distrib 5.6.47
・osx10.15

#あらすじ
`Rails`でWEBアプリを作成し初めて`heroku`へデプロイするときにうまくできなかったり画面が表示されず困ったのでケアレスミスもありますがその時の対処を載せます。

#問題点1(アプリ名)
アプリ名やファイル名に`アンダーバー「_」`は使用できないということ。自分の場合はGithubへもPUSHができませんでした。
`ハイフン「-」`は利用できるので自分の場合はハイフンを変更することにより進みました!

#問題点2(マイグレーション)
デプロイ後にマイグレーションしてなかった。初めてのことだったので、この単純な作業になかなか気づけませんでした。。。

“`
git push heroku master
“`
その後にDBを作成を忘れずに!

“`
heroku run rake db:migrate
“`

#問題点3(DBの種類が違う)
`heroku`のDBは『PostgreSQL』であり自分の環境(MySQL)と異なっていたこ

元記事を表示

【Railsチュートリアル 4章】Rails風味のRuby

# 引数のデフォルト値
メソッドを呼び出した時に指定した引数は、メソッド側で先頭から順に代入されていきます。
この時、代入するオブジェクトが無かった場合(呼び出し側で指定した引数の数が、メソッド定義側で指定した引数よりも少なかった場合)、
デフォルト値が設定されていればその値が代わりに代入されます。

“`ruby
def printHello(msg=”No msg”, name=”No name”)
print(msg + “,” + name + “¥n”)
end

printHello(“こんにちは”, “佐藤”) #=>こんにちには,佐藤
printHello(“お元気ですか”) #=> お元気ですか,No name
printHello() #=> No msg, No name

“`

“`ruby
def printHello(msg=”No msg”, name=”No name”)
print(Kconv.tosjis(msg + “,” + name + “¥n”))
end

“`

# カスタムヘルパー

Railsのビューでは膨

元記事を表示

【Railsチュートリアル 3章】リファクタリング

# DRYなコードを書く

同じコードを書く事はRubyの「DRY」(Don’t Repeat Yourself: 繰り返すべからず)という原則に反する。

# provideメソッド
文字列とラベルを与えて、関連付ける

“`erb
<% provide :ラベル, 'タイトル' %>
“`

**yieldメソッドを用いて呼び出す**

“`erb
<%= yield(:ラベル) %>
“`

# application.html.erbのレイアウト

下のコード内にあるyieldは

例えば/static_pages/homeにアクセスすると
home.html.erbの内容がhtmlに変換され、<%= yield %>の位置に挿入される。

“`erb
:application.html.erb



<%= yield(:title) %> | Ruby on Rails Tutorial Sample App
<%= csrf_meta_tags %>

元記事を表示

operator does not exist: timestamp without time zone ~~ unknownというエラーの対処

#環境
・Rails 6.0.3.2
・mysql Ver 14.14 Distrib 5.6.47
・osx10.15
・herokuへデプロイ

#あらすじ
railsでWebアプリを作成しherokuへデプロイするときにエラーが発生した。

heroku log でエラーを確認すると以下のような表示を発見

“`
operator does not exist: timestamp without time zone ~~ unknown
“`
エラー文は初めはよくわからなかったがtimestampとはカラムの型なので型のところで何かエラーが起こっていることがわかりさらに調べて見ました。

そうするとDBの検索の条件文に問題点があることが判明。
もうすこし詳しくいうと、データの作成日時で検索をかけていたロジックが以下みたいに文字列(string型)で検索していたため問題が発生。

“`
where(‘created_at: LIKE(?)’, “%%-%%-%%”) #左記は問題のコード
“`

#原因
原因は端的にいえばherokuのDBは『PostgreSQL』であ

元記事を表示

rails g controller コマンドで作成されるファイルを制限

*環境:rails 6.0.3*

`rails g controller <コントローラー名> <アクション名>`
を実行すると、`controller`と`view`以外の、**特に必要のないファイル**が作成される。

これを回避するために、`rails`プロジェクト内に、次のファイルを作成すれば,
`controller`と`view`以外のファイルが作成されないようになる。

“`ruby:config/initializers/generators.rb
Rails.application.config.generators do |g|
g.assets false
g.helper false
g.skip_routes true
end
“`

上記ファイルの作成が面倒なときは、
`rails g controller`コマンドを実行時に下記3つのオプションを追加して実行する。

“`ruby:
rails g controller <コントローラー名> <アクション名> –no-assets –no-helper –skip-routes

元記事を表示

テーブル設計(Active Hashを利用する)

# 概要
今回は、フリマアプリのクローンサイトを作る上でテーブル設計をしていきました。
初めて自作で作るのでテーブル設計のクオリティはまだまだですが、とりあえずアウトプットということで見逃してください、、、

## ER図
このようになりました。
![テーブル設計.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696517/31a51428-7f87-6eaa-15b3-1ed426f07d13.png)

ポイントとしては、既存のデータから選択させるような箇所はActive Hashを用いてファイルを用意しておくことです。
商品のコンディションや、購入時の届け先の都道府県など、、、
都道府県を表すprefectures(active_hash)テーブルに関しては発送元と届け先で二箇所利用しています。

## Active Hashの使い方
### インストール
Gemfileに以下を記載してbundle installする。

“`ruby:Gemfile
gem ‘active_hash’

元記事を表示

(´-`).。oO(標準出力の『Hello』をお手軽に探したい。

Ruby初心者です。

今日は「Hello World」を出力するだけのrakeタスクを作りました。

“`
# rake hoge:hello
“Hello World”
“`
結果に「Hello」が含まれていることを確認するテストを書いてて、簡潔に文字列指定で探せる方法があれば良いと思ったのですが。。。

## コード

“`hoge_spec.rb
require ‘rails_helper’
require ‘rake’

RSpec.describe ‘Hoge’, type: :task do

# 中略

describe ‘rake hoge:hello’ do
let(:task) { ‘hoge:hello’ }

context ‘標準出力のHelloを探せ’ do

it ‘標準出力でHello #1 outputマッチャーの引数に文字列’ do
# ※理想型。ただし完全一致しないので失敗する。。。
expect{ @rake[task].invoke() }.to output(‘H

元記事を表示

rails イメージ画像表示の仕方

アウトプット用に記述しました。

rails のアプリケーションサービスを1から作っています。間違いがあればご指摘お願いします。
今回はアプリケーションサービスにアクセスした際のトップ画面にイメージ画像をフルスクリーンで表示させる方法を記録します。

##image_tagメソッドの定義

“`
<%= image_tag "画像の名前", class:"クラス名" %>
“`

“`
<%= image_tag "top-img.jpg", class:"pict" %>
“`

表示するファイルの置き場所はapp/assets/imagesフォルダとpublicフォルダの2つが用意されています。

今回私はダウンロードしてきた画像をapp/assets/imagesフォルダに入れました。
![image_tag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674511/f6321e27-f591-adf5-bedd-df3ef48fe5b7.png)

リロードすると

元記事を表示

OAuth 2.0、ぼくのかんがえたさいきょうのscope

※ OAuth 2.0の規程に則って「認可サーバーを作成する」側の話です。

OAuth 2.0では、 `scope` というパラメーターでアクセス範囲を表します。

> クライアントは scope リクエストパラメーターを用いて要求するアクセス範囲を明示することができる.
同様に, 認可サーバーは発行されたアクセストークンの範囲をクライアントに通知するために scope レスポンスパラメーターを使用する.

このscopeですが、どんな形式にするかは実装者に委ねられています。RFCが定めている制約といえば下記くらいのものです。

* 大文字と小文字は区別する
* スペースは使えない(複数のscopeをスペース区切りで表すため)
* scopeを省略しても良いことにしても良い(その場合デフォルト値を定義する)

ref. https://openid-foundation-japan.github.io/rfc6749.ja.html#scope

**めっちゃ自由。**自由すぎてどんな形式にするのが良いかちょっと悩みます。
この記事では他社事例を見た後、ぼくのかんがえたさいきょうのs

元記事を表示

実装するにあたり、テストを記述したのち、処理をコーディングする

### 背景
現場でのあるあるですが、普段は以下の流れで開発を進めることが多いと思います。
(1)設計→(2)処理のコーディング→(3)テストのコーディング→(4)単体テストなど…

しかし、Railsチュートリアルでは、
(1)設計→(2)テストのコーディング→(3)処理のコーディング…
という流れで解説されていました。自分も少し勉強になったので、記事として掲載しようと思います。

### 環境
| 項目 | 内容 |
|:—————–|:——————:|
| OS | aws #35-Ubuntu SMP(Cloud9)|
| Ruby | ruby 2.6.3p62 (2019-04-16 revision 67580) |
| Ruby On Rails |

元記事を表示

OTHERカテゴリの最新記事