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

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

Active Record でよく使うメソッド

| メソッド | 役割 | 戻り値 | 記述例 |
|:–|:–|:–|:–|
| valid? | 対象のオブジェクトが有効かどうか確認 | true or false | user.valid? |
| save | データベースに対象のオブジェクトを保存させる | true or false | user.save |
| create | モデルの生成と保存を同時におこなう | 成功:オブジェクト自身
失敗:エラー | User.create(name: ‘hoge’, email: ‘fuga’) |
| destroy | 対象のオブジェクトの削除 | 成功:オブジェクト自身
失敗:エラー | user.destroy |
| find | 引数にidを入れてデータベースからレコードを取得 | 成功:対象のオブジェクト
失敗:エラー | User.find(1) |
| find_by | 引数にkeyとvalueを入れて、データベースからレコードを取得 | 成功:オブジェクト自身
失敗:nil | User.find_by(

元記事を表示

RailsのTips

*個人的な備忘録となります*
## 目次
– [データベースのインスタンスにアクセスするとき、.(ドット)+カラム名で値が取得できる理由](#データベースのインスタンスにアクセスするとき、.(ドット)+カラム名で値が取得できる理由)

#### データベースのインスタンスにアクセスするとき、.(ドット)+カラム名で値が取得できる理由
Active Record を継承したクラスで作られたインスタンス(オブジェクト)だから、.メソッドを使って値の取得が可能になっているから。
通常のRubyの記法ではないため、ハッシュオブジェクトに対して値を取得したいからドットで書いたらエラーになる。

###### Rubyにおけるハッシュの値の取得方法
“`ruby:example.rb
hash = {name: ‘hoge’, email: ‘fuga@example.com’}

hash[:name]
=> “hoge”

# .で取得しようとするとエラーになる
hash.name
NoMethodError (undefined method `name’ for {:name=>”hog

元記事を表示

アソシエーションの概念について

# アソシエーションとは
例えば、ブログを投稿したユーザー名を表示するには、ユーザーとブログモデルを関連付ける必要があります。
このような2つの**モデル間の関連付け**のことをアソシエーションといいます。
そして、この関連付けには外部キーが必要になってきます。

## 外部キー
外部キーとは、複数のテーブルを結びつける時に使用するカラムのことです。
関連付けのために、テーブルに関連付け用のカラムを追加します。
外部キーは関連付け先のテーブルでは主キーになります。

(例)ユーザー全員がuser_idという名札をつけることにより、ブログとの結びつきを表す、というのが外部キーのイメージです。
この時、一人のユーザーが複数のブログを所有するという関係性が成り立つので、ブログとユーザーは、一対多の関係性で紐づいていると言えます。
Blogテーブルにuser_idがあったら、user_idはusersにおいては主キー、blogテーブルでは外部キーと呼ばれます。

また、`どちらが主で、どちらが従なのか?`という視点は、アソシエーションを設計する際にとても重要な情報になります。

###

元記事を表示

【Rails】未経験者がポートフォリオを作って感じたこと、指摘されたこと

## はじめに

ポートフォリオを作って感じたこと、指摘されたことなどをまとめます。
よく言われていることではあると思うのですが、実際に自分が体感したのは大きかったなと思いました。

他の方のポートフォリオ作りの参考になればいいなと思います。
が、一方で、これは自分で苦しまないとわからないよなとも思うので、「そうなんだフーン」くらいに流し見してください。

### ポートフォリオについて

隙あらば宣伝。Twitterのハッシュタグつきツイートを自動取得するサービスです。よかったら登録して使ってみてください。
https://hashlog.work/
https://github.com/aiandrox/hashlog

RailsとVueとWebpackerでSPAっぽい感じにしています。ログイン周りはRailsに任せているので完全なSPAではないですが。
正直、Vueに関してはまだまだ自分の知識が足りないのとおまけ的な要素が強いので(テストも書いていない)、この記事ではRailsの部分にしか触れていません。

#### バージョン

– Rails 5.2
– Vue.js

元記事を表示

Railsで電話番号(固定電話・携帯電話)を正規表現で表し、バリデーションとテストを書いてみた

## はじめに
電話番号のバリデーションをするために電話番号を正規表現で表してみた。

正規表現については下記を参考にしてください。
[初心者歓迎!手と目で覚える正規表現入門・その1「さまざまな形式の電話番号を検索しよう」](https://qiita.com/jnchito/items/893c887fbf19e17d3ff9)
[Ruby | Rubular で ruby の正規表現を検証しながら作成 #ruby #正規表現](https://qiita.com/tbpgr/items/6fe1762cdbaccf26c571)
[Rubular](https://rubular.com/)(正規表現を検証しながら確認できます)
## 電話番号の前提条件
電話番号には様々な組み合わせ(桁数・ハイフン・括弧)があるが今回は下記を前提として表現する

・固定電話
 ・全部で10桁
 ・頭が0
 ・末尾は4桁
 ・ハイフンや括弧が入る可能性がある(なくても良い)

・携帯電話
 ・全部で11桁
 ・1,3桁目は0
 ・2桁目は5-9
 ・ハイフンや括弧が入る可能性がある(なく

元記事を表示

You must use Bundler 2 or greater with this lockfile. 解決法

# はじめに
既存railsアプリをDockerに切り替える時に起きた問題になります。
正確には下のコマンドのようにビルドしようとした時に起きる問題です。
`$ docker-compose build`

## 発生したエラーメッセージ
“`
$ docker-compose build



Step 9/10 : RUN bundle install
—> Running in 11137a2dced0
You must use Bundler 2 or greater with this lockfile.
ERROR: Service ‘web’ failed to build: The command ‘/bin/sh -c bundle install’ returned a non-zero code: 20
“`
## はまったこと
You must use Bundler 2 or greater with this lockfile.
(このロックファイルではbundler2以上を使用する必要がある)
と言われているのにbundlerのバージョンは

元記事を表示

Railsでgroup_by

#グループIDをメンバーの多い順に並び替える

| group_id| user_id |
|——–:|——–:|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 2 |
| 3 | 1 |
| 3 | 3 |

“`ruby

groupsHash = groups.group(:group_id).order(‘count(user_id) desc’).count(:user_id)
#=> {1=>3, 3=>2, 2=>1}
“`

ここから人数が2人以上のグループidの配列を取得する

“`ruby

ids = groupsHash.filter_map{ |group| groupsHash[0].to_i if groupsHash[1] >= 2}

#=> [1, 3]
“`

元記事を表示

Rubyの配列操作

#map
人数が5人以上のgroupのidを配列で返すイメージ

“`ruby

ids = groups.map{ |group| group.id if group.count >= 5}

#=> [1, 2, nil, 4, ・・・]
“`

条件に当てはまらない要素はnilになる

#.reject(&:blank?)
配列からnilと空文字を無くす

“`ruby

ids = groups.map{ |group| group.id if group.count >= 5}.reject(&:blank?)

#=> [1, 2, 4, ・・・]
“`

#filter_map
上記をまとめて。Ruby2.7から利用可能

“`ruby

ids = groups.filter_map{ |group| group.id if group.count >= 5}

#=> [1, 2, 4, ・・・]
“`

#join
連結した文字列を返す。引数に入れた文字列を挟み込みことができる

“`ruby
[‘A’,’B’,’C’].join
#=> “ABC

元記事を表示

Rails によるカスタム例外の設定とエラーハンドリング

Rails で例外を発生させたい際は,`raise`…つまり RuntimeError をよく使用するかと思います。

しかし,サービス上の制約から,特定の状況下で例外を発生させる場合,`raise`だけでは物足りなくなる時があります。
`raise`では「何かまずいことが起きてしまいました!」程度のことしか伝えてくれません。まぁ,引数に渡す message を見れば理解できるかもですが…

兎にも角にも,特定の状況下に対する例外が存在するなら,その例外に対して名前を付けてあげましょう。

カスタム例外を設定すると,発生時に「何に対する例外か」がパッと理解できるようになりますし,特定の動作に誘導することも容易になりますので,良いことづくめです!

– 参考 URL 等
– [項目22 | Effective Ruby(長尾高弘 arton PeterJ\.Jones)|翔泳社の本](https://www.shoeisha.co.jp/book/detail/9784798139821)
– [Railsアプリケーションにおけるエラー処理(例外設計)の考え方

元記事を表示

Rails アセットプレコンパイル時のエラー’ActionView::Template::Error (The asset “application.css” is not present in the asset pipeline.’の解消方法

# 背景
– 作成したRailsアプリケーションをデプロイしてページにアクセスしたところ、以下のエラー画面が出てアクセスできなかった。

– そこで、log/production.rbを確認したところ、以下のエラーが出ていた

“`log/production.rb
ActionView::Template::Error (The asset “application.css” is not present in the asset pipeline.):
“`
このエラーの解決に非常に手間取ったので、正しい方法かはわからないですが、自分の環境での解決策をシェアします。

# 環境
Rails 5.2.4
Ruby 2.6.4

# 解決策
#### config/environments/produc

元記事を表示

dockerイメージ内にyarnをインストールする

# 背景
Dockerを利用して作成したRailsアプリ(v5.2.4)を本番環境にデプロイする際、アセットをプリコンパイルしようとしたところ、以下のエラーがでて実行できなかった。

“`sh
$docker-compose run web bundle exec rake assets:precompile RAILS_ENV=production
“`
“`sh
Starting excite-map_db_1 … done
Yarn executable was not detected in the system.
Download Yarn at https://yarnpkg.com/en/docs/instal
“`

# 解消方法
Dockerfileに以下を追加

“`Dockerfile
RUN curl https://deb.nodesource.com/setup_12.x | bash
RUN curl https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add –
RUN echo “deb

元記事を表示

【hidden_field】rails hidden_field を使って情報を送ろう!!!!

##【ゴール】
hidden_fieldを使って情報を送る

![画面収録 2020-06-21 20.06.48.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620689/9e87f94c-dc60-e890-ebe2-39d8383ce937.gif)

##【メリット】
■ paramaterの理解度向上
■ hidden_fieldの使い方理解
■ MVCの理解度向上

##【開発環境】
■ Mac OS catalina
■ Ruby on Rails (5.2.4.2)
■ Virtual Box:6.1
■ Vagrant: 2.2.7

##【実装】

####アプリケーション作成
※「scaffold」で一気に作成

“`mac.terminal
$ rails new hidden_lesson
$ rails g scaffold Item name:string text:text price:integer amount:integer
$ rails db:m

元記事を表示

【Rails】PG::AmbiguousColumn: ERROR: column reference “name” is ambiguous

#【Rails】PG::AmbiguousColumn: ERROR: column reference “name” is ambiguous

アソシエーションが張られた同じカラム名を持つ2つのモデルでそのカラム名を使ったメソッドを定義したところ上記のエラーが出ました。その際の対応内容をまとめます。

## 目次
* [動作環境](#動作環境)
* [状況](#状況)
* [解決策](#解決策)
* [考察](#考察)

—————————————
## 動作環境
`OS : macOS 10.14.6`
`ruby : 2.6.5`
`Rails : 5.2.4.2`

## 状況

`カテゴリモデル`と`ユーザモデル`はそれぞれ`name`という同じ名前のカラム名を持ち,多対多のアソシエーションが張られている状況です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526570/978b7ae4-a20f-6bb7-133f

元記事を表示

VPSでRailsアプリを動かすまでの全手順【Rails6, Capistrano, Puma, Nginx, MySQL, HTTPS】

VPSを契約してRailsアプリを動かすまでの手順をまとめました。
似たような記事はいくつかありますが、本記事には以下のような特長があります。

– ツールのバージョンが比較的新しい
– Ruby2.7系、Rails6系、MySQL8系、CentOS7系
– アプリケーションサーバーにPumaを使用
– GitHubのプライベートリポジトリで管理されているアプリでもデプロイできる
– 独自ドメインに対応
– HTTPSに対応
– Railsアプリの開発環境をDockerで作成

以下、設定方法です。

## OSインストール
VPSサービスのコンパネからCentoOS7をインストールします。(以下はさくらのVPSの場合のキャプチャです)
 2020-06-14 15.55.20.png

元記事を表示

minitestでモック、スタブする(RR、WebMock、MiniTest::Mockを使う)

# この記事について
仕事で、railsのテストフレームワークにminitestを使っています。そして、railsプロジェクトの中では、モックやスタブをするときに、RR、WebMockといったgemや、minitest標準のモックであるMiniTest::Mockが使われています。
テストを書くときに、モックやスタブの書き方に戸惑うことが多くありました。
この記事では、テストダブルとはどんなものか、モックとスタブの違いはなにか、RR、WebMock、MiniTest::Mockそれぞれの使い方について記述します。

# テストダブル(モック、スタブ)とは
まず、テストダブルとはどんなものでしょう。また、モック、スタブの違いはなんでしょう。

– テストダブルとは、ソフトウェアテストにおいて、テスト対象が依存しているコンポーネントを置き換える代用品(ダブルは代役、影武者を意味する)
– モックもスタブも、テストダブルの一種

## テストダブルの5つのバリエーション
テストダブルは、[xUnit Test Pattern](http://xunitpatterns.com)の書籍によると

元記事を表示

Ajaxを使った非同期通信化実装STEP

#1.jQueryを記述するFile作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630397/30655214-1882-cf08-a724-c50e6c9de6ce.png)

– app/assets/javascripts内にcomment.js(非同期通信を行うcontroller名.js)を作成。

#2.イベントの発火を設定
– pictweetのcomment-formが送信された時、のイベント設定

“`javascript:comment.js
$(function(){
$(‘#new_comment’).on(‘submit’, function(e) {
e.preventDefault();
var formData = new FormData(this);
var url = $(this).attr(‘action’)
$.ajax({
url: url,
type: ‘POST’,

元記事を表示

git push herokuで Precompiling assets failed.の対処法

#はじめに
GitHubにgit pushした後、
Herokuにgit push herokuをした際に

“`
remote: !
remote: ! Precompiling assets failed.
remote: !
“`
とエラーが発生した。

#環境

Rails(5.1.4)

#エラーを確認する

“`
//省略
Running: rake assets:precompile
remote: Yarn executable was not detected in the system.
remote: Download Yarn at https://yarnpkg.com/en/docs/install
remote: rake aborted!
remote: Sprockets::FileNotFound: couldn’t find file ‘html2canvas/dist/html2canvas.js’ with type ‘application/javascript’

元記事を表示

診断アプリの作る方法(jQueryのみで実装)

#概要

https://shindans.herokuapp.com

診断アプリを作りました。

こんな感じ
[![Image from Gyazo](https://i.gyazo.com/f6a3da6cbca98879d47c1af942982187.gif)](https://gyazo.com/f6a3da6cbca98879d47c1af942982187)
こちらの診断アプリをJS(jQuery)のみで実装したので記事をしました。

#まずは、ビューを用意する。
“`haml
#wrapper
.question
%h1.title ソーシャルスタイル診断
%ul.questions
%li.textBox
%span.text Q1. 冷静で人からの指示は嫌い
%label.yes
%input.typeA.typeD{:name => “q01”, :type => “radio”}>/
YES
%label.no
%inp

元記事を表示

【Rails】ancestryを用いた多階層カテゴリー機能の実装『Bootstrap3でウィンドウ作ってみた編』

# 目標

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579893/d3eb6d46-4fee-961a-18f6-22203b583d19.gif)

# 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# 前提

下記実装済み。

・[Slim導入](https://qiita.com/matsubishi5/items/b639ffddecc626856039)
・[Bootstrap3導入](https://qiita.com/matsubishi5/items/b117c95f4dd71340cc80)
・[Font Awesome導入](https://qiita.com/matsubishi5/items/a4c72f436e64ad106ee8)
・[ログイン機能実装](https://qiita.com/mat

元記事を表示

[Rails]アプリケーションの日時表示を日本時間にする方法

## Railsの時間基準
Railsの時間基準はデフォルトで協定時(UTC)となっています。
今回はこれを日本時間に修正する方法をまとめています。

## タイムゾーン設定の記述
設定方法はシンプルです。
Railsのなかにある**application.rb**の中身を編集するだけ!

“`application.rb
# 省略
class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.time_zone = 'Tokyo' #ここを追加 # Settings in config/environments/* take precedence over those specified here. # Application configuration can go into files in config/initializers # -- all .r

元記事を表示

OTHERカテゴリの最新記事