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

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

美しきRubyリファクタリング(Part1)

## イントロダクション

Part1で終わるかもしれませんが、シリーズ化決定。

その名も「美しきRubyリファクタリング」。
名前が映画みたいでカッコいいね。

## 今日のリファクタリング

RSpecを書いているときに出くわしたリファクタリングのチャンス。

before:

“`ruby
let(:process) do
if process_type.is_a? Array
process_type
else
[process_type]
end
end
“`

after:

“`ruby
let(:process) { process_type.is_a?(Array) ? process_type : [process_type] }
“`

これでとても簡潔なコードになった!

## 最後に

三項演算子が好きではない方にはグッと来ないリファクタリングだったかもしれないことに少し反省。
だが、私は「1行で書けるところは1行で書く」ということを愛している(茶番)

機会があれば、次の「美しきRubyリファクタリ

元記事を表示

エラー文について②!

#①.結論!

前回の内容と同じです!

Webアプリケーション開発中は、エラーが頻繁に起きます!

エラー解決を重ねていくことで、Railsの全体像や仕組みの理解が深まるといっても過言ではありません!

エラー解決のために必要な前提知識を理解して、様々なエラーについて学びたいと思います!

#②.NoMethodError in 〇〇〇〇Controller#show

今回のエラーは、「詳細」のボタンをクリックするとNoMethodErrorが発生するというものです!

そして、このエラー解決のゴールは「投稿の詳細画面が表示されること」です!

このエラー文が出た際、下のような表示が続きます!

“`
undefined method `comment’for Did you mean? comments comment=
“`

エラー文を見てみると、NoMethodErrorと出ています!

また、undefined method ‘comment’と表示されています!

これは、commentというメソッドが定義されていないというエラーになります!

そして、もう一つ着目

元記事を表示

【RSpec】名前空間のあるモデルのFactory生成

##環境
Ruby 3.0.2
Rails 6.1.4.1

##名前空間のあるモデル

“`model.rb
module Slack
class Channel < ApplicationRecord ... end end ``` ##それに対するFactory生成 classで指定する ```spec/factories/slack/channels.rb FactoryBot.define do factory :channel, class: Slack::Channel do ... end end ``` ↑がうまく行ってないと下記のエラーが出る ``` NameError: uninitialized constant ``` ##参考 今回は使わなかったがlintを使うのも良さそう https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#linting-factories

元記事を表示

【RSpec】ハッシュの検証

##環境
Ruby 3.0.2
Rails 6.1.4.1

##ハッシュの検証

今まではハッシュのkeysとvaluesがそれぞれ期待する値で返っているかどうか一つ一つ検証していた。

“`model.rb
User.published_articles
# => { user.id => [article1, article2], user2.id => [article3] }
“`

“`spec.rb
expect(User.published_articles.class).to eq Hash
expect(User.published_articles.keys[0]).to eq user.id
expect(User.published_articles.values[0][0]).to eq article1
expect(User.published_articles.values[0][1]).to eq article2
expect(User.published_articles.keys[1]).to eq user2.id
expect(Use

元記事を表示

【Rails】マイグレーションファイル関連のコマンドまとめ

##はじめに
マイグレーションファイル関連のコマンドのまとめです。

##migrationを実行

“`
$ rails db:migrate
“`
##データベースを作成

“`
$ rails db:create
“`
##データベースを削除

“`
rails db:drop
“`

##migrationの実行、データベース作成、削除をまとめて行う

“`
$ rails db:reset
“`

##migrationを削除
削除する際にはまず、ステータスを確認。

“`
$ rails db:migrate:status
“`
ステータスの部分がdownになっていれば削除。
upになっている場合、downにする。

“`
$ rails db:rollback  ・・・ 一つ前をdownにする
$ rails db:rollback STEP=○ ・・・ ○個前までdownする
$ rails db:migrate:down VERSION=20211101101010  ・・・ ファイルを指定してdownする
“`
最後の「2021110110

元記事を表示

エラー文について①!

#①.結論!

Webアプリケーション開発中は、エラーが頻繁に起きます!

エラー解決を重ねていくことで、Railsの全体像や仕組みの理解が深まるといっても過言ではありません!

エラー解決のために必要な前提知識を理解して、様々なエラーについて学びたいと思います!

#②.No template for interactive request

今回のエラーは、投稿ボタンを押したらNo template for interactive requestというエラーが表示されるというものです!

タイトルを確認すると、「No template」となっています。これは、ビューファイルが見つからないというエラーです!

No templateのエラーが出ているため、「〇〇〇.html.erbのファイルがおかしいのでは?」という仮説がたてられます!

仮説をもとに、例として、app/views/〇〇/new.html.erbを確認すると、nwe.html.erbとなっており綴りが間違っていることが確認できます!

正しく、new.html.erbと修正して解決できます!

#③.まとめ

エラー

元記事を表示

RailsのAPIをブラウザのコンソールから呼ぶ

### POST
“`js
await (await fetch(‘/example/api’, {
method: ‘POST’,
headers: {
‘Accept’: ‘application/json’,
‘Content-Type’: ‘application/json’,
‘X-CSRF-Token’: document.querySelector(“meta[name=’csrf-token’]”).getAttribute(‘content’)
},
body: JSON.stringify({
params1: ‘パラメータ1’,
params2: ‘パラメータ2’,
})
})).json()
“`

### GET
“`js
await (await fetch(‘/example/api’)).json()
“`

元記事を表示

Couldn’t find Schedule without an IDを解決する

rails初学者です。現在、オリジナルアプリを作成中で、削除機能をつけようとした時に、
Couldn’t find Schedule without an IDという「IDがありませんよ!」 というエラーが出ました。

まず最初にbinding.pryで

“`ruby:schedules_controller
binding.pry
schedules = Schedule.find(params[:id])
schedules.destroy
“`
paramsの中身を確認したところ、
pramsにはidではなく、formatが代入されていました。

そこで、routes.rbを確認すると

“`ruby:routes.rb
resources :posts do
resource :schedules, only: [:update, :edit, :destroy]
end
“`
とschedulesのresourceが単数系になっていて、このままではIDを付与してくれないので、resourcesの複数形に直し、

“`ruby:index.htm

元記事を表示

本番環境で写真投稿をすると500エラーが出る

##使用技術
Rails6.0.3
nginx
puma
AWS s3

##発生した問題
本番環境で写真投稿をすると何故か500エラーが出てしまい、またnginxのログなどをみても何も表示されない。

##やったこと
まず初めにaws s3のセッティングができていなかったのでそれをいろいろな記事をみて実装した。しかしそれでも写真を投稿することができず、同じエラーに見舞われた。

##解決方法
いろいろ調べているうちにこの記事( https://fuen-works.hatenablog.jp/entry/2018/04/18/100154 ) に出会った。ここには/etc/nginx/nginx.confの所有者と/var/lib/nginxの所有者を一致させることで解決したと書いてあり、僕の場合、前者はec2-user、後者はrootになっていたので、それをこの記事をみながらコマンドで修正したところいきなり写真を投稿できるようになってしまった。

##感想
まったく何がどのように動作して今回の問題が発生したのか全くわからずの解決だったがとりあえず写真がアップできて嬉しいです笑。デプ

元記事を表示

【RubySilver対策】Ruby特化のクイズサービスを作りました。

#はじめに

ポートフォリオとしてRubyの問題を提供するクイズアプリ**『RubyMania』**をリリースしました。
資格勉強でなくてもご利用頂けるかと思います。

https://www.rubymania.info

私自身プログラミング未経験ではございますが、学習を始めて5ヶ月くらいの頃にRubyを体系的に学んでみたいと思ったのがきっかけでRubySilverとRubyGoldを取得させて頂きました。  

RubySilverとRubyGoldを取った時の話はまたどこかで記事に出来ればと思います!

当時資格を勉強していて感じた事としては、
①知ってるメソッドが一つ増えると読めるコードが増えるので勉強が楽しい
②初学者が資格取るとモチベーション上がってもっと頑張ろうって思える
③でも資格教本の問題やネットにある問題をやり尽くしてしまってこれ以上どうして良いか分からない
④しかも答えと問題を暗記してしまってこれ以上どうして良いか分からない

そんな楽しさの共有と悩みを持つ方の一助となれたら嬉しいなと思ってこのサービスを作りました。

難易度としては
①Progateで

元記事を表示

[Rails]has_oneやbelongs_toをリロード!削除されたときの挙動がreload_associationとreloadで違うので注意!

ActiveRecordのアソシエーションは1度取得するとキャッシュしてくれるため、2度目からはSQLが発行されません。
この機能はとても便利なのですが、たまに最新の情報にリロードしたいときがあります。

例えば下記のようにuser.profile.addressが別で更新された場合です。

“`irb
irb(main):001:0> user = User.first

# profileは初回アクセスなので、SQLが発行される
irb(main):003:0> user.profile.address
Profile Load (0.9ms) SELECT `profiles`.* FROM `profiles` WHERE `profiles`.`user_id` = 2 LIMIT 1
=> “住所だよ”

# profileはキャッシュしているのでSQLは発行されない
irb(main):004:0> user.profile.address
=> “住所だよ”

# 別プロセスでprofile.addressを更新
irb(main):005:0> Profile

元記事を表示

Ruby on Railsのscaffoldを使ってみる

##はじめに
Ruby on Railsのscaffoldを使ってみました。
今までは勉強のために一つ一つ記述していたのですが、一度も使ってなかったのでお試しです。

###scaffoldとは
調べてみると、今まで一つ一つ記述していたモデル、コントローラー、ビュー、ルーティングを自動的に作成してくれるみたいですね。
すごく手間が省かれますね。めっちゃ便利!!

###使ってみた
まずはコマンドです。今回はモデル名は「Post」で作成します。

“`
$ rails g scaffold Post カラム名 データ型
“`

“`
            invoke active_record
create db/migrate/20211031145458_create_posts.rb
create app/models/post.rb
invoke test_unit
create test/models/post_test.rb
create test/fixtures/

元記事を表示

【422 Unprocessable Entity 】のバリデーションエラー、外部キー制約が原因でした。

コードを書いてテストを実行したら**「422 Unprocessable Entity」**というエラーが出ました。
ググってみたらバリデーションエラーみたいです。
そして、自分の場合は外部キー制約の書き方に問題がありました。

### 環境
– Ruby 2.6.3
– Ruby on Rails 6.0.1

#結果
:::note
modelの外部キー制約のチェックを任意にしてあげる。
:::

#前提
利用者(User)が車を1台持っていたり**持っていなかったりする**状況でした。

“`ruby
class User < ActiveRecord::Base has_one :car end class Car < ActiveRecord::Base belongs_to :user # ↑ここが違っていた。 end ``` この状況だとCarモデルに`user_id`がセットされていないとバリデーションエラーが発生します。 そのため、利用者が車を持っていない場合に422エラーが発生していました。 #解決 `optional: true`を追加して

元記事を表示

【個人用rails tutorial -3

静的ページの生成

①コントローラー,モデル,アクションの削除方法

“`
$rails destroy 〜
“`

②マイグレーションの変更を1つ前に戻す方法

“`
$ rails db:rollback
“`

③最初に戻したい時

“`
$ rails db:migrate VERSION=0
“`
※マイグレーションは逐次的に実行され、マイグレーションに対してバージョン番号が付与される。上記の0を別の数字に置き換えることによって、指定したバージョンの状態に戻せる。

テストスイート(Test Suite)

①なぜテストを行うのか
>1.機能停止に陥るような回帰バグ(Regression Bug: 以前のバグが再発したり機能の追加/変更に副作用が生じたりすること)を防止
>2.コードを安全にリファクタリング(機能を変更せずにコードを改善)できる。
>3.アプリケーションコードから見ればクライアントとして動作するので、アプリケーションの設計やシステムの他の部分とのインターフェイスを決めるときにも役に立つ。

②テスト方法
>1.te

元記事を表示

Rails+React+MySQL+nginx+puma on Docker

はじめまして。
初投稿です。
よろしくお願いします。

# 概要
Docker

# 自己紹介
初投稿なので軽く自己紹介します。
現在横浜の大学に通うB3で絶賛就活中です。

Qiitaの方々の記事に大変お世話になっているのでぜひ自分も書いて誰かの役に立てればと思い書いてみました。
誰かのtipsになれば幸いです。

承認欲求強めです。いいね、ストック、スター、フォローしてくれると飛び跳ねるくらい嬉しいです。
よろしくお願いします。

# すぐはじめたい方へ
完成版
[github](https://github.com/nakanoi/react_rails_nginx_docker)
`clone`後`setup.sh`を実行すればコンテナが立ち上がります。

# 構成
## バック
| | version |
|——————|———|
| Ruby | 2.6.2 |
| Rails(API モード) | 6.1.4 |
| nginx | 1.20.1

元記事を表示

【個人開発】チーム開発にしてみたらメリットいっぱいな話

## 結論

個人開発の目的が
`楽しみたい` or `勉強のために`ならチーム開発するべき

### ターゲット

– 1人で個人開発をしてる人
– 駆け出しエンジニア
– マネジメント力をつけたいと思っている人


### 筆者経験

2ヶ月かけて[個人開発アプリ](https://www.ideee.tech/)を作った
現在、計6人体制でチーム開発を行なって2ヶ月目!

### 作ってるアプリ

アイデアとエンジニアのマッチングアプリ

https://qiita.com/naruqiita/items/f8773efc49651c457cb3

## これまでの背景

駆け出しエンジニアは増えている
`一番の鬼門である就職の難易度UP`
→ お金を払ってでも実務経験を得るサービスなんてのが出てきた。。?

https://gimejob.com/

正直な感想?

`うわ〜、きち〜`です

#### ツイートからの募集

【RSpec】Railsチュートリアル第6版 第8章

#はじめに
Railsチュートリアル第6版のテストをRSpecで書き直していく。

###目次
– [第3章](https://qiita.com/supyolo888/items/35081ead2cfafb40a995)
– [第4章](https://qiita.com/supyolo888/items/939b670b62eb18467f6d)
– [第5章](https://qiita.com/supyolo888/items/42234ac2ed3919b14586)
– [第6章](https://qiita.com/supyolo888/items/bd10e64c77fe391cf203)
– [第7章](https://qiita.com/supyolo888/items/d2824ced26402b5f58d1)
– 第8章(本記事)

#事前準備
Gemfileにテストデータ作成用のFactory Botを追加

“`rb:Gemfile
group :development, :test do
gem “factory_bot_rails”
end

元記事を表示

【Ruby silver】範囲式 フリップフロップ演算子

次のコードを実行するとどうなりますか。 

“`
10.times{|d| print d == 3..d == 5 ? “T” : “F” }
“`

解説文

d == 3..d == 5の部分は条件式に範囲式を記述しています。
この式は、フリップフロップ回路のように一時的に真偽を保持するような挙動をとります。
詳細は、Rubyリファレンスに詳しい説明がありますのでそちらを参照してください。

  • https://docs.ruby-lang.org/ja/latest/class/Range.html
  • 初めて見た時に混乱しました。
    どうゆう順番で評価するか整理して考える必要があったのでまとめます。

    **⑴Rangeの復習**

    “`ruby
    # ..の場合
    a = (1..5).to_a
    => [1, 2, 3, 4, 5]

    # …の場合
    a = (1…5).to_a
    => [1, 2, 3, 4]
    “`
    ?
    ..の場合は5を含む1〜5の範囲になる。
    …の場合は4.9999…までは対象になるが5は範囲に

    元記事を表示

    細かいつまずいたことをメモしておく(10月編)

    # はじめに

    2021年10月も仕事や勉強でつまづいたことをまとめて自分用のメモとしてあげておきます。
    調べればすぐわかる程度で私が記事にする必要はないなと思ったもです。

    今月は仕事の繁忙期を乗り切り(来月再来予定)、比較的落ち着いた1か月となりました。

    しかし、Windows11が始まるなどのトラブルが起きており、それに関連した問題に対処しました。

    # 問題

    ## 1. GoogleColabratoryでMeCab+Neologdを使いたい

    https://qiita.com/jun40vn/items/78e33e29dce3d50c2df1

    こちらの記事を参考にした。

    インストールは以下のコマンド

    “`
    !apt-get -q -y install sudo file mecab libmecab-dev mecab-ipadic-utf8 git curl python-mecab > /dev/null
    !git clone –depth 1 https://github.com/neologd/mecab-ipadic-neologd.git > /

    元記事を表示

    Progate Ruby on Rails5 VI ~ VII 個人的ざっくりまとめ

    # emailの重複がないかチェック

    バリデーションで`uniqueness: true`を指定

    “`rb:models/user.rb
    class User < ApplicationRecord validates :email, {uniqueness: true} end ``` # マイグレーションファイルのみ作成 データベースに変更を加えるが、モデルは必要ないとき `rails g migration ファイル名`をターミナルに入力 ```terminal:ターミナル $ rails g migration add_image_name_to_users ``` # マイグレーションファイルの仕組み テーブルの変更を加えるには、マイグレーションファイルのchangeメソッドの中に処理をかく ```rb:20170427053118_add_image_name_to_users.rb class AddImageNameToUsers < ActiveRecord::Migration[5.0] def change # 変更内容 e

    元記事を表示

    OTHERカテゴリの最新記事