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

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

Rails6.0ルーティングまとめ

#はじめに

Rails6.0のルーティングのパス名 resouces resourceなどを忘備録を兼ねてまとめます。

#明示的なルーティング指定

“`routes.rb
# ルートへアクセスするルーティング
root ‘users#show’
root to ‘users#show’
root ‘/’, to: ‘users#show’
“`

“`routes.rb
# ‘/users/:id’でusersコントローラのshowアクションにルーティング
get ‘/users/:id’, to: ‘users#show’
“`

“`routes.rb
# ‘hoge’でusersコントローラのshowにルーティング
# as:オプションを使うとルーティングに名前を指定可能
get ‘/users/:id’, to: ‘users#show’, as: ‘hoge’
“`

<%= form_with %><%= link_to %>などでurlを指定する際に、直接/posts/:idなどのurlのように指定可能ですが、変更の際に修正箇所が多くなり得策ではありま

元記事を表示

Safari で disable_with オプションを付けても変わらない場合

Railsでフォームを作る際、送信ボタンに disable_with オプションを付けることで、二重送信を防ぐことができる。

“`ruby
= f.button ‘送信する’, data: { disable_with: ‘送信中…’ }
“`

しかし、Safariに限って、なぜかボタンの文言が変化しなかった。GitHub上でも、多々報告されている。
[disable_with doesn’t work with link in Safari #306](https://github.com/rails/jquery-ujs/issues/306)

## 解決策

結論から書くと、JSで送信処理をあえて遅らせることで、とりいそぎは回避できた。
Issue内ではバニラJSで書かれた例が出てくるので、jQueryを使っていなけば、そちらを参考にした方が早いかもしれない。

“`ruby
= f.button ‘送信する’, data: { disable_with: ‘送信中…’ }, class: ‘disable_with_safari’
“`
“`js
$(‘.dis

元記事を表示

【rails】他テーブルのDBの情報をビューで表示させる

# はじめに
 この記事は、学んだことを復習するために投稿者が理解できる言葉まで落とし込んで書いております。まだまだ初心者ですが、この記事が読んでくださった方の悩みが解決すれば嬉しいです。

# 1.結論

1. アソシエーションが定義されていること
* ルーティングが入れ子構造(ネスト)になっていること
* 表示させたい側のコントローラーで値を取得していること
* ビューで表示させる記述がなされていること

# 2.コード

## 2-1.テーブル
* itemsテーブル

“`ruby
class CreateItems < ActiveRecord::Migration[6.0] def change create_table :items do |t| t.string :name , null: false # 商品名 t.text :explanation , null: false # 商品の説明 t.integer :category_id

元記事を表示

【Rails6.0】突然CSSが読み込まれなくなった、、【怪奇現象?】

現在個人開発でRailsアプリを作っているのですが、正常に動いていたRailsアプリのCSSが突然読み込まれなくなり(画像ファイルも)無駄に時間を食ってしまいました。
結局はっきりとした原因はわかりませんが、解決するまでの過程をここに書いていこうと思います。

**開発環境**

– windows10 Pro
– Rails: 6.0.3.2
– ruby: 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
– Docker for windows
– MySQL 5.7
– nginx:1.15.8

##エラーが発生した経緯
rspecのシステムスペックでテストを書いて実行、失敗を10回ほど繰り返してlocalhost(root_path)にアクセスしたら
CSSが反映されなくなっていた。
そのときのConsoleのエラー内容↓

“`
Failed to load resource: the server responded with a status of 500 (Internal Server Error

元記事を表示

RSpec – ‘users validation’のテストコードをレビューしてもらった結果

# はじめに
みなさん、こんにちわ!Qiitaの投稿、ruby、rails、rspec初心者の J です!
つい先日、「プロから見た僕のspecはどうなの?」というのが気になり、
[RSpec – ‘users validation’のテスト](https://qiita.com/denjneb/items/36f0f86271b5ebd1a4d1#comment-9fb76aed6af4ca75cea5) を質問として、投稿しました。
そして、rubyやrspecについての動画をyoutubeで配信されていて、
僕の先生である@jnchito さんにコードレビューをしてもらいました!
テストコードは、そこそこ長かったのですが、一つ一つ徹底的に指摘してもらえて、
「僕ならこう書く!」を丁寧に解説してくださいました!
おかげさまで、
>「ルールに従ったテストコードがなんなのか」と迷子になり、
なかなかcommitできず、地獄を彷徨っています。

から開放されて今は天にも上ような気分です!、、レビュー頂いて本当にありがとうございます。。泣

### @jnchito さんについて
有名なの

元記事を表示

クラスとモデル

##クラスとは
– rubyの概念
– 複数のデータと処理(メソッド)をまとめて入れた箱(オブジェクト指向)。設計図のようなもの。

##モデルとは
– railsの概念 ~~Ruby~~
– クラスには違いないが、必ずモデルに対応したテーブル(データベース)を持つ
– 例えばPostモデルにはpostsテーブル(テーブルには複数のデータが入るため名前は複数形になる) => 逆にモデル名は必ず単数形で命名すること。

元記事を表示

(ギリ)20代の地方公務員がRailsチュートリアルに取り組みます【第14章】

##前提
・Railsチュートリアルは第4版
・今回の学習は3周目(9章以降は2周目)
・著者はProgate一通りやったぐらいの初学者
##基本方針
・読んだら分かることは端折る。
・意味がわからない用語は調べてまとめる(記事最下段・用語集)。
・理解できない内容を掘り下げる。
・演習はすべて取り組む。
・コードコピペは極力しない。

 
ラストじゃ!!!!!最後まで駆け抜けろ!!!!!

 
ラストを飾るBGMはこちら。
[My Bloody Valentine “Loveless”](https://www.youtube.com/watch?v=OrMjc4oz0mY)
始まりにして終わりみたいな一枚。もはやオチ担当。大音量で脳汁たらしながら聴きましょう。

 
####【14.1.1 データモデルの問題(および解決策) 演習】
1. 図 14.7のid=1のユーザーに対してuser.following.map(&:id)を実行すると、結果はどのようになるでしょうか? 想像してみてください。ヒント: 4.3.2で紹介したmap(&:method_name)のパターンを思い出して

元記事を表示

【Rails】devise, devise_token_authで、ユーザー作成ログインの初期設定

#新規ユーザーモデルを作成する時

##deviseの設定

“`shell:
$ rails g devise:install
create config/initializers/devise.rb
create config/locales/devise.en.yml
“`

“`routes.rb
Rails.application.routes.draw do

devise_for :users, :controllers => {
:registrations => ‘users/registrations’,
:sessions => ‘users/sessions’
}

devise_scope :user do
get “sign_in”, :to => “users/sessions#new”
get “sign_out”, :to => “users/sessions#destroy”
end
end
“`

devise_for :モデル

元記事を表示

DBから特定のカラムの数値を取り出したい(自分メモ)

Aテーブル:user
Bテーブル:user_info

目的:
Bテーブルの特定カラム(ここではuser_main_id)の数値を返したい

やり方:
用意されているのは、Aテーブルの@user_sessionのみ。

1. Aテーブルの@user_sessionの中のidを探し出す。
2. Aテーブルのidと、Bテーブルのuser_idの数値を一致させる
3. Bテーブルの中でidで一致した後、目的のカラム(user_main_id)を取得する

“`ruby:Ruby
API表示名: user.find_by(user_id: @user_session.record.id).user_main_id
“`

@user_sessionの中身が何かが重要!

参考URL
https://qiita.com/tsuchinoko_run/items/f3926caaec461cfa1ca3

元記事を表示

form_withによるname属性とid属性の自動付与

動作環境
Ruby 2.6.5
Rails 6.0.3.2

form_withを使った場合、name属性とid属性が自動で付与されていたことに気づかずにエラーをよく起こしていたので、投稿してみました。

##form_withにmodelを指定し、name属性とid属性が自動で付与される具体例
“`ruby:new.html.erb
<%= form_with model: @hoge, local: true do |f| %>
<%= f.text_field :fuga %>
<%= f.submit "投稿する" %>
<% end %>
“`
上記のように、modelを@hogeに指定し、検証ツールにてname属性とid属性を確認すると、**name=”hoge[fuga]”、id=”hoge_fuga”**となります。nameとidを指定していないのに、自動でname属性とid属性が付与されています。

先ほどのコードでは、name属性とid属性を指定しない場合は自動で付与されるという話でしたが、name属性とid属性を指定した場合はどうなるのかを見ていきまし

元記事を表示

[Rails]simple_calendarの導入方法

#はじめに
アプリ開発でカレンダーを用いた実装をしたかったので簡単にまとめました。

###simple_calendarとは
simple_calendarとは、簡単にカレンダー機能を付け加えれるgemです。
月間カレンダー、週間カレンダーなど日付指定をしてカレンダーを作成することができます。
今回は月間カレンダーを用いた方法となっております。

#目次
1. simple_calendarのインストール
2. simple_calendarのビューの生成
3. カレンダーを表示
4. カレンダーのレイアウトの変更
5. おまけ

#1. simple_calendarのインストール
gemファイルに以下を追記し、アプリケーションのディレクトリで「bundle install」を実行します。

“` gem.file
gem “simple_calendar”, “~> 2.0”
“`
#2. simple_calendarのビューの生成
simple_calendarのビューファイルを生成するために、以下のコマンドを実行します。
レイアウトをカスタマイズしたいときはこのコマンド

元記事を表示

【Rails6】Devise+SNS認証で登録&ログイン(複数連携可)

###はじめに
複数のSNSと連携可能な認証をつくります。
Deviseは実装済みとして進めます。
各APIキーの取得等にも触れませんので適宜お調べ下さい。
今回はfacebookとtwitterで実装しますが他のSNSでも基本的には同じだと思います。

###環境

“`console:環境
Windows10
ruby 2.6.6
Rails 6.0.3.1
“`

###下準備

#####gem追加

“`rb:Gemfile
gem ‘omniauth’
gem ‘omniauth-facebook’
gem ‘omniauth-twitter’
“`
保存後bundle installして下さい。

#####credentials.ymlにAPIキーを記述

Windowsの方は[前回の記事](https://qiita.com/ChangGin/items/369ade18ed49f932cb42)を参考にしてみてください。

“`yml:credentials.yml

facebook:
api_key: pk_test_~
secret_key:

元記事を表示

seed-fuを使ってseedデータを作成する方法

## はじめに
railsにはデフォルトでseedが使えますが、初期データを入れる際にはseed-fuを使う方が便利なようです。
sedd-fuでは一部のレコードを更新したり、指定のモデルだけのデータを作成したりできます。
今回は、seed-fuの導入方法と基本的な使い方をご紹介します。

## seed fuをインストール
Gemfileに記載して、bundle installします。

“`:Gemfile
gem ‘seed-fu’
“`

“`:ターミナル
$ bundle install
“`

## ディレクトリ構成
`db/fixtures`は最低限必要なディレクトリなのでこちらは作成してください。
`db/fixtures` に作成した seedファイルを置くこともできますが、`db/fixtures/development`、 `db/fixtures/production`のようにseedファイルを作成すると環境ごとに異なるデータを作成することもできます。

また、`db/fixtures`以下のseedファイルはアルファベット順に読み込まれます。
以下

元記事を表示

Railsプロジェクトを作成したあとにActiveRecordを使わないようにする

`rails new`するときに`–skip-active-record`オプションを付けなかった場合から付けた場合への差分です。

Railsプロジェクトを作成したあとに、DBを使わなくなった場合などの参考に。

Railsバージョン6.0.0.3

“`diff:.gitignore
– # Ignore the default SQLite database.
– /db/*.sqlite3
– /db/*.sqlite3-journal
– /db/*.sqlite3-*

– # Ignore uploaded files in development.
– /storage/*
– !/storage/.keep
“`

“`diff:Gemfile
– # Use sqlite3 as the database for Active Record
– gem ‘sqlite3’, ‘~> 1.4’

– # Use Active Storage variant
– # gem ‘image_processing’, ‘~> 1.2’
“`

元記事を表示

FizzBuzz問題を解いてみよう!

【概要】
—————————————-
1.結論

2.FizzBuzz問題とは何か

3.どのようにプログラムするのか

4.ここから学んだこと

1.結論
—————————————-
eachメソッドとif..elsifを組み合わせよう!

2.FizzBuzz問題とは何か
—————————————-
結論としては、コードが書けないプログラマー志願者を分けるために作られたプログラムです。

具体例としては、
(i)1~100の数字を出力する際に、
(ii)3の倍数は”Fizz”
(iii)5の倍数は”Buzz”
(iv)15の倍数は”FizzBuzz”
を表示させる

というプログラムです!
基本的なことが理解できているかを試せる問題として有名です!

3.どのようにプログラムするのか
—————–

元記事を表示

【rails】enumのレコード登録数をバリデーションで制限する方法

## はじめに
開発を行っているとenumを使って、データを分ける場合があると思います。
enumで分けたデータに対してそれぞれレコードの登録数を制限する実装をしたのでメモとして残しておきます。

## 開発環境
Rails 6.0.3
Ruby 2.7.1

## テーブル
今回は下記のようなUsersテーブルを想定しています。
性別(sex)はenumでman/femaleのどちらかしか選択できないようにしています。

|name|sex(enum)|
|—|—|
|ユーザー1|man|
|ユーザー2|female|

## レコード数を制限する方法
models/user.rbにメソッドを作成し、man/femaleそれぞれのレコード数を確認して、もし制限数(10件)を超えていればエラーを追加します。
`on: :create`を記載しないと毎回バリデーションが適用され、編集できなくなってしまうので忘れないよう!
(私はここに気づかず編集の際にエラーが発生してしまいました。)

“`user.rb
class User < ApplicationRecord RE

元記事を表示

【Rails】on: :actionの条件付きで設定したコールバックはskip_callback、set_callbackを用いて回避することができない

skip_callbackとset_callbackを用いて一時的にコールバックを回避しようとしたらset_callbackがうまくいかなかった。その時の状況と回避策を記録。

### やりたいこと
こちらのコールバックを一時的にスキップしたい。
“`ruby
before_validation :func, on: :action
“`

### 最初にやったこと
`skip_callback`、`set_callback`を用いて実装した。

“`ruby
skip_callback(:validation, :before, :func)
——————————————
# 処理を実行
——————————————
set_callback(:validation, :before, :func)
“`

しかし、このあと他の動作に不具合が出てしまい、原因を調査した。

#### skip_callback、set_callbackとは

`skip_callba

元記事を表示

【Rails】ローカル環境のデータがおかしいから全部リセットしたい!と思うその前にすべきこと

## はじめに

以下のQiita記事を拝見しました。

[エラーが解決しない時は、元を断つという考え方 \- Qiita](https://qiita.com/TeppeiMimachi/items/755639c775c72cb73ad9)

詳しくは上記記事を読んでもらいたいのですが、簡単に要約すると「ローカル環境のデータがおかしくなったら、(データを消しても問題ないことを確認したうえで)データベースを再作成しよう」という内容です。

ただ、個人的には「うーん、あまりよくないな」と思ってしまったので、返信コメントを書こうと思いました。
コメントを書き始めたらかなり長くなってしまったので、独立した記事にしてしまおうと思いました。
それが本記事になります。

というわけで、ローカル環境のデータがおかしいから全部リセットしたい!と思うその前にすべきことを以下にまとめます。

## ローカル環境のデータがおかしいから全部リセットしたい!と思うその前にすべきこと

(注:以下の内容はもともと[冒頭に載せたQiita記事](https://qiita.com/TeppeiMimachi/it

元記事を表示

【Rails】開始時刻と終了時刻を保存する

# 開始時刻と終了時刻を保存する
railsで、タスクの開始時刻と終了時刻を保存するプログラムを作ります。
自己流の部分が多いので、あくまでやり方の1つとして参考にしてくださると幸いです。
※今回は、開始、終了時刻を保存することをメインに扱います。削除、編集機能や見た目は勘弁してください。

![画面収録 2020-09-25 2.57.23.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566871/80c7b5e2-fea2-c5b6-e5e8-09e0af4c518f.gif)

# 考え方
開始、終了フォームを1度だけしか押せない仕組みを目指します。
具体的には、タスクの開始時刻のデータが入っている場合は開始ボタンを表示しないように、ビューの中にif文を書きます。
この考えに至った経緯は、以下の通りです。

・タスク(Task)に、開始時刻(StartTime)と終了時刻(StopTime)を紐付ける
 →問題点:何回でも開始し、終了できてしまう。
・StartTimeのデータが入って

元記事を表示

エラーが解決しない時は、元を断つという考え方

どうも、三町哲平です。

プログラミングをしていたら必ずエラーに出会す場面が出てきます。
簡単に解決できるエラーもあれば、何時間、下手したら数日掛かっても解決しないそんなやる気すら失ってしまうエラーも存在します。

そういうやる気を失ってしまう時に役立つエラーに使えるかも知れないテクニックを一つ紹介します。
尚、今回はRuby on Railsで発生したエラーですが、データベース絡みのエラーだとRails問わず、どのプログラミング言語での開発環境においても効果的です。

今回は、エラー発生から3日掛かって解決しましたので、短くわかりやすくまとめてみました。

# まず、結論
この記事の概略を説明すると、
__データベースが元の異常ぽかったら、データベースを再作成した方が早いよ。__
ていう話。

では、3日間の闘いをどうぞ!

## 1日目. Template::Error
![スクリーンショット 2020-09-09 13.33.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688029/480

元記事を表示

OTHERカテゴリの最新記事