Rails関連のことを調べてみた2021年09月29日

Rails関連のことを調べてみた2021年09月29日

Railsのタイムゾーン

学習のアウトプットとして投稿しています。
何かご指摘がございましたらお願いいたします。
# Railsのタイムゾーンについて
## デフォルト
railsはデフォルトでは全ての時間がUTCで扱われる。
デフォルトのままフォームに時刻を入力すると、その時刻がUTCの時刻としてDBに登録される。
以下は、イベント①の開始時間を2021年9月29日10時00分とフォームで入力した時にDB保存された値。

“`
1|イベント①|2021-09-29 10:00:00|…
“`

## Railsの時間を日本時間に合わせる
日本で使うことを想定しているサービスの場合はRails内のタイムゾーンを日本時間に直す。
タイムゾーンを日本時間にするにはconfig/application内にconfig.time_zone = “Tokyo”を加える。

“`config/application.rb
module SampleApp
class Application < Rails::Aplication 略 config.time_zone = "Tokyo" e

元記事を表示

【Ruby on Rails】whereメソッドを使って投稿内容の絞り込み表示をしよう

今回は投稿内容を絞り込みで表示してみましょう

##目次
**1.前提**
**2.whereメソッドについて**
**3.コントローラー記述**
**4.ビュー記述**
**5.ルート記述**

###1.前提
今回は既に投稿と一覧ができる状態であることとします。
例としては下記のような状態であるとします。

“`ruby:burgers_controller.rb
class BurgersController < ApplicationController def index @burgers = Burger.all end def new @burger = Burger.new end def create burger = Burger.new(burger_params) if burger.save redirect_to :action => “index”
else
red

元記事を表示

バリデーションについて

* オブジェクトがデータベースに保存される前に、データが正しいかどうか検証する仕組み

“`rb:モデル
validates :カラム名(シンボル), 検証ルール(シンボル)
“`

# 空データを登録できないようにする
* presence

“`rb:モデル
class Post < ApplicationRecord validates :content, {presence: true} ``` # 文字数の制限をつける * length ```rb:モデル class Post < ApplicationRecord validates :content, {presence: true, length: {maximum: 140}} ``` # 一意性(重複するデータを登録できないようにする) * uniqueness ```rb:モデル validates :content, uniqueness: true ```

元記事を表示

【Rails】to_jsonを使わずに1クエリでいい感じにデータを返したい

## include

to_jsonには便利なオプションが沢山ある.特にinclude.多対多のデータをモデルの要素に配列として返してくれて便利.

https://qiita.com/eggc/items/29a3c9a41d77227fb10a

例えば,fooとbarそれぞれのモデルが多対多の関係にあるとして

“`rb
JSON.parse(Foo.queries.to_json(include: :bars))
“`

とすれば,

“`rb
[{id: 1, bars: [{id: 1}, {id: 2}]}]
“`

ただ,一対多なら+1, 多対多のテーブルなら中間テーブルを足して+2多くクエリーが発行される.まとめて取得したいテーブルが増えると線形に増えていってしまう.

## 1クエリーで同じ様に返すには?

なんか他にいいメソッドないかな…と思ったがない.ので書いてみる.モデルは上と同じ.DBはMYSQL.

“`foo.rb
require ‘hashie’
require “securerandom”

# 色々

scope hoge, ->

元記事を表示

MySQLで、カラムの型を変更する

# はじめに
開発環境はrailsのデータベースを使用しており、本番環境では「Amazon RDS」の「MySQL」を使用していた。
そこでカラムの型を変更する必要があったので、下記のコードを実行したら問題なく変更できた。

# 結論
MySQLに接続し、以下のコードを実行してください

“`
ALTER TABLE [テーブル名] MODIFY [カラム名] [変更したい型];
“`

#経緯
開発環境のRailsで緯度、経度を登録しているテーブルがあり、それぞれのカラムを`float`で登録していました。

しかし、本番環境の「Amazon RDS」にそのまま移行すると、登録していた数値が正しく表示されませんでした。

おかしいと思って調べてみると、`float`は単精度浮動小数点実数と言って有効桁数が7桁までとのこと。

一方で、`double`というデータ型であれば、倍精度浮動小数点実数と言って有効桁数が16桁まであるようです。

なので、対象のデータ型を`float`から`double`に変更すれば良さそうだと気づきました。

#実行

1.MySQLに接続し、データベー

元記事を表示

[Rails]renderメソッドとは?

##初めに
####なぜこの記事を書きたかったのか
最近やっとrenderで気づいたことがあったので言語化して記憶の定着のために書きたい!

####環境
・Macbook Air (Retina, 13-inch,2019)
・プロセッサ 1.6GHz デュアルコアIntel Core i5
・メモリ 8GB 2133 Mhz LPDDR3
・MacOS Big Sur バージョン 11.5.2

####記事の目次
**1)どんなことができるのか**
**2)どうやってつかうのか**
**3)オプション**
**4)自分が混乱していたこと**
**5)最後に**

##どんなことができるのか
####renderメソッドで指定したviewファイルへ移動もしくは配置することができる!
####renderメソッドはapp/viewsを起点としてパスを渡すと、渡したパスを出力してくれる!

####(例えば)
**1)このQiitaのページの上の緑色の部分を各viewファイルに一回一回コードを書くよりrenderを使えば、renderを使うことで一発で配置することができる!**
**2

元記事を表示

rails6にアップデートしたので `switch_point` gemを外す

# やりたいこと
* 複数DBに接続する際にお世話になっていたgem `switch_point` がrails6.1はサポートしないということなのでで外す

# 対応したこと
## switch_pointの削除
“`rb
gem ‘switch_point’ # 削除
“`

`bundle install` 実行

## database.ymlの変更
### 変更前
“`yaml
default: &default
adapter: mysql2
username: <%= ENV['DATABASE_USERNAME'] %>
password: <%= ENV['DATABASE_PASSWORD'] %>
host: <%= ENV['DATABASE_HOST'] %>
database: <%= ENV['DATABASE_NAME'] %>
socket: <%= ENV['DATABASE_SOCKET'] %>

default_readonly: &default_readonly
<<: *default host:

元記事を表示

dockerの環境構築で躓いた。 bind: Only one usage of each socket address

“`ruby
docker-compose run web rails new . –force –no-deps –database=mysql –skip-test –webpacker
“`

をやった時のエラー。

エラー文

> Starting book_leveling_db_1 … error

> ERROR: for book_leveling_db_1 Cannot start service db: Ports are not available: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

> ERROR: for db Cannot start service db: Ports are not available: listen tcp 0.0.0.0:3306: bind: Only one usage of each socke

元記事を表示

【Ruby on Rails】本番環境でデータベースをリセットする方法

#対象

* 本番環境でのデータのリセットに悩まされている方

#目的

* 本番環境でデータをリセットして新たにデータをセットする準備をする

#実際の手順と実例
###1.前提

* Ruby on Railsを使ったアプリ開発
* AWSのEC2を使用してサーバー構築

###2.本番環境でのデータベースリセット

まずは開発環境(cloud9から)EC2へSSHでログインし、自分のアプリケーションのディレクトリに移動します。

““
$ ssh -i ~/.ssh/[キー名][ユーザー名]@[パブリックIPアドレス]
$ cd [アプリケーション名]
““
※ [ ] を入力する必要はありません。

下記のコマンドを打てばOKです。

““
RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rails db:drop
““

これだけでは、エラーが発生してしまいますので、忘れずにデータベースの内容を反映させます。

““
rails db:create RAILS_

元記事を表示

プログラミングスクール生のここがダメ(インフラ構成を理解していない)

##はじめに
どうも、27歳未経験からエンジニア転職を目指しているもきおです。

これは当時プログラミングスクール卒業したての頃、エンジニア採用面接でのお話

**面接官**「えーそれではこのポートフォリオってOSは何を使ってるんですか?」
**もきお**「えっとーEC2ですかね?」
**面接官** (。。。ダメだこりゃ)

その後普通にお見送りになりました笑

お見送り理由も当時エージェントさんからいただいたのですが技術知識習得に受け身な姿勢と受け取られてしまったみたいです。

このようにとりわけプログラミングスクール生は自分も然りインフラ構成への理解が甘くなる傾向にあると感じています。

###なぜスクール生はインフラ構成の理解が甘くなるか?
これは明確にカリキュラムが充実しすぎているのがあるかと思います。
項目ごとに画面がスクショされててその手順書通りにポチポチGUI操作で作成していけばできてしまうのでインフラ構成の理解が甘い。

そしてとりあえず作れれば良いやという感覚に陥りがち。それではダメなんです。
理解し人に説明できなければ面接でいざ聞かれた時に全然見当違いな答えを言って

元記事を表示

Railsでpublic/packs/manifest.jsonの中身がないというエラーが出てハマった(AWSデプロイ時)

#エラー内容
AWSにRailsアプリを“git clone“でデプロイした時に以下のエラーでどハマりしました。

“`
ActionView::Template::Error (Webpacker can’t find application.js in /var/www/rails/アプリ名/public/packs/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment
unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacker’s config/webpacker.yml file.
4. Your webpack configuration is not cre

元記事を表示

ActiveModelSerializerのserializerとeach_serializerの違い

#ActiveModelSerializerとは
RailsでAPIを作る時、 JSON形式(わかりやすく)にしてくれるgemのことです。

#serializeを使うとき

例えばstaff一覧をコントローラーで取得する時
これはあくまで例です。

“`
def index
@staff = Staff.new
render json: staff, serializer: StaffSerializer
end

“`
serializerと書くとStaffSerializerを呼び出してくれる。
これはstaff1人を呼び出す時に使う。

#each_serializeを使うとき
staff詳細を取得する時

“`
def show
@staffs = Staff.all
render json: staffs, each_serializer: StaffSerializer
end

“`
each_serializerを使うときは、複数取得したいときに使います。

他にもcreateやupdateで1

元記事を表示

【Rails】エラーメッセージを日本語化する

本記事では、入力フォームが空のまま送信された場合に表示されるエラーメッセージを、
英語から日本語に変換する方法をアウトプットしていきます。

# 前提条件
・Rubyバージョン2.6.5
・Railsバージョン6.0.0
・エラーメッセージを表示したいページは作成済みとします。

# この記事の構成
①エラーメッセージのビュー作成
②部分テンプレートの呼び出し設定
③日本語の言語設定とGemの導入
④`devise.ja.yml`の作成
⑤`ja.yml`の作成
⑥バリデーションでさらに詳細なエラーメッセージを設定

#①エラーメッセージのビュー作成
まずはエラーメッセージを生成するビューを作ります。
どのモデルのバリデーションにも対応できるように、if文に`model.errors.any?`を記述しています。

“`app/views/layouts/_error_messages.html.erb
<% if model.errors.any? %>

    <% model.errors.full_

元記事を表示

form_with scope

railsではデフォルトとして、form_with model:@userとした場合、Userモデルnew=>createと推察して勝手にレールを準備してくれる。

<%= form_with model: モデルクラスのインスタンス do |f| %>

<% end %>

例えば、以下のように記述したとき、railsは「ふむふむ、@userということはUsermodelのnewを経由して、createに飛ばせばいいんだな」と判断してくれる。

~~~
<%= form_with model:@user do |f| %>
<%= f.label :email %>
<%= f.email_field :email, class: 'form-control' %>

<%= f.submit "submit", class: "btn btn-primary" %>
<% end %>
~~~

ただし、modelが存在しない場合はurlとscopeを指定してあげる必要がある。

<%= form_with ur

元記事を表示

railsチュートリアル第6章 セキュアなパスワードを追加する

##セキュアなパスワードを追加する
ユーザー属性の「名前」と「メールアドレス」に対してバリデーションを追加したので、最後に「“`セキュアなパスワード“`」に取り掛かります。セキュアパスワードという手法では、各ユーザーにパスワードとパスワードの確認を入力させ、それを“`ハッシュ化“`したものをデータベースに保存します。
いきなりハッシュ化と言われると少し困惑してしまうかもしれません。
ハッシュとはRubyのデータ構造であると説明しましたが、今回の「ハッシュ化」とはそういった構造ではなく、ハッシュ関数を使って、入力されたデータを“`元に戻せない(不可逆な)データ“`にする処理を指します。

ユーザーの認証は、“`パスワードの送信“`、“`ハッシュ化“`、“`データベース内のハッシュ化された値“`との比較、という手順で進んでいきます。
比較の結果が一致すれば、送信されたパスワードは正しいと認識され、そのユーザーは認証されます。
ここで、生のパスワードではなく、“`ハッシュ化されたパスワード同士を比較“`していることに注目してください。
こうすることで、生のパスワー

元記事を表示

railsチュートリアル第6章 を検証する

###一意性を検証する
メールアドレスの一意性を強制するために(ユーザー名として使うために)、validatesメソッドの:uniquenessオプションを使います。
ただしここで重大な警告があります。次の文面は流し読みせず、必ず注意深く読んでください。

まずは小さなテストから書いていきます。
モデルのテストではこれまで、主にUser.newを使ってきました。
このメソッドは単にメモリ上にRubyのオブジェクトを作るだけです。
しかし、一意性のテストのためには、メモリ上だけではなく、実際に“`レコードをデータベースに登録“`する必要があります14 。
そのため、まずは“`重複したメールアドレスからテスト“`していきます。
####重複するメールアドレス拒否のテスト

“`rb
require ‘test_helper’

class UserTest < ActiveSupport::TestCase def setup @user = User.new(name: "Example User", email: "user@example.com") end

元記事を表示

Railsチュートリアル 1.4.3 Push時のエラー解決方法

Railsチュートリアル第1章の1.4.3で、Githubへのpush時にエラーが出るようになっているので、
解決方法のメモとなります。

# エラー内容
チュートリアルの1.4.3で下記コマンドを実行するとエラーが発生する。

“`sh
$ git push -u origin master
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
“`

調べてみるとGitHubが2021年8月13日にパスワード認証を廃止したことが原因のようです。
https://news.mynavi.jp/article/20201222-1604003/

Ra

元記事を表示

Rails-ERDの使い方

#Rails-ERDとは
railsを使ってER図を自動生成するものです。

*ER図とは
ER図(Entity Relationship Diagram)と言ってデータベースを考える際の設計図みたいなものです。
ER図を作成することにより、データベースの関係を図にまとめてわかりやすくなります。

詳しくは下の資料からご覧ください。

若手プログラマー必読!5分で理解できるER図の書き方5ステップ

#Rails-ERDの導入法
まずは***Graphviz(グラフビズ)***というグラフ描画ツールを導入します。
Homebrewで導入する場合は下のコマンドを使います。

“`
$ brew install graphviz

“`
この後Gemfileの中に導入します。

“`Gemfile

group :development do
gem “rails-erd” # 追加
end

“`
この後、bundle installで導入をします。

#ER図を出力

以下のコマンドを使います。

“`
$ bundle

元記事を表示

railsサーバーを停止せずにターミナルを閉じてしまった時の対処法

#ターミナルを閉じずにサーバーを止めた時
処理をしている時、サーバーを止めずにターミナルを閉じると以下のエラーが出ます。

“`
Address already in use – bind(2) for “0.0.0.0” port 3000」

“`

“`
A server is already running. Check /Users/taro/git/hello_world_rails/tmp/pids/server.pid.
Exiting

“`
のようなエラーが出ます。

この状態だと “`control + c“` でサーバーを止めても、処理は続いていることになります。

#現在動いてるプロセスを確認する
サーバーが動いている時、“`プロセスID“`というものがあります。
これを下のコマンドで調べる必要があります。

“`
$ lsof -i:3000

“`
*補足
3000はポート番号です。
ポート番号の説明は下の記事から確認してください。
https://pikawaka.com/rails/rails-s/#%E3%83%9D%E3%83%

元記事を表示

GraphQL-Rubyでenum(列挙型)を使う方法

# はじめに
GraphQl-Rubyでenumを使う方法についての解説です。
間違っている箇所等ございましたらコメントで指摘いただけると助かります。

# Enum(列挙型とは??)
詳しくはこちらの記事(自分が書いたもの)に書いてあります。
https://qiita.com/nisitin/items/94720f8dae3be39ae5d2

一部抜粋して説明するとenumは[列挙型]と言われるもので[列挙型]とは何かというと、プログラミング言語やデータベース管理システムなどにおけるデータ型の一つとされています。また複数の異なる定数を一つの集合として定義するものでもあります。

# Railsのenum使うよね??
僕は少し前にRailsのenumの使い方について学んで、そこから馬鹿の一つ覚えのようにenum使えそうじゃない??と思うようになりました。そこでGrapqQL-Rubyを使ってapi開発をしてたときにここでも使いたい!!と思い馬鹿の一つ覚えのように使おうとしました。

そして調べてみるとenumで定義している文字列はGraphQLでは識別子として書き込まれて返ってく

元記事を表示

OTHERカテゴリの最新記事