Ruby関連のことを調べてみた2021年08月28日

Ruby関連のことを調べてみた2021年08月28日
目次

改訂版・(あなたの周りでも見かけるかもしれない)インスタンス変数の間違った使い方

この記事は僕が以前書いた「[(あなたの周りでも見かけるかもしれない)インスタンス変数の間違った使い方](https://qiita.com/jnchito/items/49fe82364bca2f4f37f5)」という記事の改訂版(というか、全面書き直し版)です。

## はじめに:そのインスタンス変数、本当に必要ですか?

僕はフィヨルドブートキャンプでメンターをやっています。そこで提出物のコードレビューをしていると、間違ったインスタンス変数の使い方をよく見かけます。例を挙げるとこんな感じです(説明用のサンプルコードなので、処理自体に意味はありません)。

“`ruby
def run
collect_data
display_data
end

def collect_data
# インスタンス変数にデータを詰める
@data = [‘a’, ‘b’, ‘c’]
end

def display_data
# インスタンス変数を読み取って画面に出力する
@data.each do |str|
puts str.upcase
end
end

元記事を表示

【Rails】「nilじゃない」と「present?」は同じ? 〜わかりにくいコードに立ち向かう〜

こんにちは
業務でリファクタをしていて、タイトルの件少し気になったのでまとめてみます

少しややこしいですが、頭の体操だと思ってお読みください
(混乱しないように、わかりやすくまとめたつもりではあります。一応。。)

否定表現ってどうしてわかりにくいんでしょうね。ただ意味が逆になるだけなのに…

# 本題
タイトルの通り`nilじゃない`という条件は`present?`と代替可能か?というテーマです

“`ruby
if !hoge.nil? # => hoge.present?でもいいのでは?
# …
end
“`

上記の例だと、「`nil`の場合に早期リターンすればいいだけじゃん」で片付くかもしれません(それか`unless`)

ですが、条件が複雑になってくると`present?`にしたい欲が込み上げてきて吐きそうになります?
(以下は吐きたくなる例)

“`ruby
if !hoge.nil? && fuga.present? # .。oO hoge.present?にしちゃだめ・・?
# …
elsif fuga.status == ‘cancel

元記事を表示

【Ruby on Rails】非同期コメント投稿時のRoutingError (No route matches [PATCH]….)を解消した話

#対象者

* コメント投稿時に[PATCH]を呼び出すエラーに遭遇している方

#目的

* ルーティングエラーを解消して、正常に稼働させる

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

* コメント機能を非同期で実装
* 投稿時、ターミナルに下記のエラーが現れる

![スクリーンショット 2021-08-27 20.30.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/a4a9cf6d-9721-c5f8-b3bc-37b2648678a1.png)

““`
ActionController::RoutingError (No route matches [PATCH] “/articles/19/comments/72”):
““

よく見ると投稿を押した段階でPATCHが呼び出されている、、、、
→本当はPOSTがほしい

* **rails route**コマンドで確認してもPOSTはあるし、PATCHはない
* 以下CommentsController

““

元記事を表示

rails consoleで例外発生時のエラーメッセージが文字化けする場合の対処方法

## 発生する問題
rails consoleで例外が発生し、そのエラーメッセージに日本語が含まれていた場合、”\xE3\x83\x90\xE3…”みたいな形で日本語が文字化けする。

たとえば以下は本来であれば「バリデーションに失敗しました: Eメールを入力してください」というエラーメッセージを表示すべき場合に文字化けする例である。

“`
> User.create!
/(railsのパス)/validations.rb:80:in `raise_validation_error’: \xE3\x83\x90\xE3…(省略) (ActiveRecord::RecordInvalid)
“`

## 原因

rails consoleで使われているirbのバージョンが1.3.5以下だとこの問題が発生する。

rails consoleで使用されているirbのバージョンを確認する場合は、rails console上で`irb_info`と入力する。

“`
> irb_info
=>
Ruby version: 3.0.0
IRB version: irb 1.3.0

元記事を表示

rails tutorial2章進めた時の覚書

2章でhello_appに加え、toy_appを製作したが、
“`
$ git push heroku master
“`

は同じように叩いてしまっていいのか?
上書きされる感じになるのかな?

herokuの管理画面見る限り、
– hello_app
– toy_app

の2つがアップロードされているわけではない?から、上書きされてるのかしら。

“` herokuアプリをブラウザで開く
$heroku open –app アプリ名
“`
参考: https://qiita.com/RyomaMaeda/items/60c96e8255996cbb375c

“` アプリ名確認
$ heroku apps
“`

アプリブラウザで確認したらエラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198412/6dcbc71b-1168-72c3-31af-6a439af240fb.png)

rails tutorialに則りログ確認からの migrate
“`

元記事を表示

【Rails】carrierwave画像投稿機能 (メモ)

# 目標
* 画像投稿機能

# 開発環境
* Rails: 6.1.3
* ruby: 3.0.0
* mac: os

# 前提
* 投稿機能実装済み
* 投稿テーブルpost

# 実装

### 1.Gemfileにcarrierwaveを記述 してインストール

“`ruby:Gemfile
gem ‘carrierwave’
“`

`bundle install`します。

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

###2.postテーブルにimageカラム追加

“`ruby:ターミナル
$rails g migration AddImageToPosts image:string
“`

マイグレーションファイルが生成されます。
`image`カラムが追加されているのを確認してマイグレーションします。

“`ruby
class AddImageToPosts < ActiveRecord::Migration[6.1] def change add_column :posts, :image, :string

元記事を表示

to_iメソッドの使い方

##to_iとは?
数字の文字列を数値オブジェクトに変換するメソッドです。
また、小数を整数に変換することもできます。

以下、サンプルコードになります。

“`ruby:使用例
オブジェクト.to_i

num = “1”
p num
=> “1” (文字列)

num.to_i
=> 1 (整数)

puts 100 + “100”  #数値オブジェクト + 文字オブジェクトは計算できない
puts 100 + “100”.to_i #to_iを使って文字オブジェクト ⇒ 数値オブジェクトに変える
⇒ 200
“`

###小数を整数に変えることもできる

“`ruby
# 小数として定義
num = 1.0
num.class
=> Float

#整数に変換
num = num.to_i
num.class
=> Integer
“`

####参考記事
https://pikawaka.com/ruby/to_i

元記事を表示

【Rails】配列の中のハッシュから値を取得する方法(map)

単一のオブジェクトから持ってくる方法と、
オブジェクトが配列に入っていて、その配列の中から一個一個とりだす方法を紹介します。

1.単一のオブジェクトからデータをもってくる方法
2.オブジェクトが配列に入っているときに、欲しいデータだけをもってくる方法

## 1.単一のオブジェクトからデータをもってくる方法
“`rb
# まず、インスタンスを取得
@user = User.find(2)

# @userの中身を確認
@user
=> #

“`

この中から欲しいデータだけを取得したいとき

“`
user[:last_name]
=> admin
“`

userがリレーションを組んでいて、リレーション先のテーブルからデータを持ってきたいと

元記事を表示

[Rails]フォロー機能導入中にActiveModel::UnknownAttributeErrorというエラー発生

# はじめに
本記事では、フォロー機能時に発生した
`ActiveModel::UnknownAttributeError`というエラーの解決した方法を記述します。
仲間に助けてもらいながら実装できたため、個人でもアウトプットして身につけたいと思い、記事にしました。

# エラー画面

![フォロー機能導入できない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1768158/6d9269d3-3e99-1950-006f-c044d6252c9e.png)

`attribute`=`属性`という意味。(Google先生)

Relationshipに`user_id`という属性は知らん。と怒られました。

![フォロー機能のsequel pro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1768158/5fa8dc25-1c57-ada7-a05a-fcbd235568db.png)

確かに、`user_id

元記事を表示

【Rails】ActiveRecord::RecordNotFound (Couldn’t find Order without an ID)の対処法

症状

RailsAPIでメソッドを作成していたところ、以下のエラーメッセージが表示されてしまいました。
翻訳すると、「IDのないHogeが見つかりませんでした」

“`ruby:error
Completed 404 Not Found in 1ms (ActiveRecord: 0.0ms | Allocations: 158)

ActiveRecord::RecordNotFound (Couldn’t find Hoge without an ID)
“`

メソッドにパラメータは以下です。

“`ruby:parameter
Parameters: {“params”=>{“id”=>12}, “hoge_id”=>”12”, “hoge”=>{}}
“`

該当のメソッドは以下です。

“`ruby:hoge.rb
class OrdersController < ApplicationController def update hoge= Hoge.find(params[:id]) render json: {

元記事を表示

【Rails】ransackによる簡易的な検索機能実装

#概要
ransackのシンプルモード(Simple Mode)を利用した簡易的な検索機能を実装しました。備忘録として記録します。
#環境
– Ruby(バージョン2.6.5)
– Rails(バージョン6.0.0)
– mysql2(バージョン0.5.3)

#実現したいこと
登録してある顧客のリストに対して、氏名(last_name, first_name)と会員ID(member_id)による検索を可能にする。
#過程
###1. ransackの導入
“`ruby:Gemfile
gem ‘ransack’
“`

“`terminal:-zsh
% bundle install
“`
###2. コントローラー
“`ruby:customers_controller.rb
def index
@customers = Customer.order(“created_at DESC”)

@search = Customer.ransack(params[:q])
@customers = @search.result
end
“`

元記事を表示

親モデルのActiveModel::Serializer内で子モデルのActiveModel::Serializerを指定する

# 実行環境

– macOS 10.15.7 (19H1217)
– Ruby 2.6.7
– Rails 6.0.3.7
– active_model_serializers 0.10.12

# 前提

– `Author`モデルと`Book`モデルは`has_many`・`belongs_to`の関係にある。
– 以下の設定が有効になっている。

“`ruby:config/initializers/active_model_serializers.rb
ActiveModelSerializers.config.default_includes = ‘**’
“`

# やりたい事

– `Author`モデルのインスタンスをJSONとして取得する際には,`AuthorSerializer`を使用する。
– `Book`モデルのインスタンスをJSONとして取得する際には,`BookSerializer`を使用する。
– `Author`モデルのインスタンスをJSONとして取得する際には,そのインスタンスが持つ`Book`モデルのインスタンスも取得する。

# やり方

元記事を表示

オブジェクト指向とは何なのか?(今理解できる範囲でまとめてみる) 初心者なりに

オブジェクト指向

これまで何回か目にし、その度に調べてるけどよく理解できていません。
こういうのって、実務経験積んでくうちに理解できてくるものなんじゃないのかな・・・と
現状あんまり理解できていない私としては思います。

Rubyはオブジェクト指向言語、JavaもJavascriptもそうらしいです。
で、オブジェクト指向って一体何なのか。。

効率よく開発するための考え方

何かのコード記述のルールがあって、それがオブジェクト指向っていうわけではなく、、
「効率よく開発をするための考え方や概念」だそうです。

特徴①カプセル化

「オブジェクト」というものが、データやメソッドなんかを一つのカプセルにまとめてしまうようなイメージです。
カプセル化されてしまうと、外からは中がどうなってるか見えません。
情報がカプセルにより「隠されている」これがカプセル化です。
カプセル化することで他からの影響を受けにくく、カプセルごと分けて考えることができます。

特徴②継承

同じようなプログラムはまとめていこうという考え方。
よく例

元記事を表示

Internship

## Peersに追加したい機能
– 自由記入欄に`
`タグなどの改行タグを入れなくても改行できるようにしたい。

> 現状、コードブロックや`
`などのhtmlタグを入れないと改行できないようになっている。

– Userの一覧ページにページネーション機能を用意したい。

> 画像などを表示しているため読み込むのに時間がかかる。
>> ページを分割することにより、ユーザが情報を見やすくできる。
>> 表示速度が上がる。

———-

## 実装
———-

### 1.  E-R図の作成

– 既存のプロジェクトの改良なのでまずはデータベース関係の構造を理解しようと思い設計図(E-R図)などを提供してもらおうとメンターに相談。

— このプロジェクトには設計書(E-R図)がなかった。メンターの串崎さんから自動でE-R図を生成できるgemがあることをご教授いただき、急遽追加したい機能の最上位にE-R図を作成するタスクを追加。

> 実装中に、どうせならカラムの追加、削除などのデータベースを変更する度にE-Rを最新のものに再生成する機

元記事を表示

[Ruby on rails]ゲストログイン機能 ゲストログインは削除、編集されないようにする

ゲストログインは作っておいた方が良い!

ゲストログイン押したら、ログインできちゃう便利機能です。
就職、転職活動でポートフォリオを外部の方に見せる場合には、作っておいた方が良いらしいです。
ゲストユーザーを作成せず、これでログインしてくださいとemail,passwordを提示したところで、
少し面倒なので見てもらえない可能性があります。
すぐ実装できるので、ゲストログインは作っておくべきだと思います!!!!
(他の人のポートフォリオ触ってみてもそうですが、
ゲストログインがないと、やっぱりすごく面倒に感じます。)

![スクリーンショット 2021-08-27 11.34.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/26e66d94-852a-f6dc-d836-a5209c29016b.png)

とても参考にした記事

https://qiita.com/take18k_tech/items/35f9b5883f5be4c6e104

元記事を表示

[axios] ファイルダウンロードができない or 空ファイルになってしまう現象の解消

フロント側はReact、サーバーサイドはRailsでファイルダウンロードが
うまくいかないケースがあり、それを解消した記事内容になります。

症状としては、axiosのissueにあったこのケースに当たります。
[Github | axios/axios | Empty response when responseType is blob or arraybuffer.](https://github.com/axios/axios/issues/1392)

サーバーサイドとフロント部分の結合部分なので、
原因の特的ができていなくて引っかかってる人が多そうですね。

私のケースの場合は、railsでheadの記述が不要だったのですが、
それだけじゃよくわからないと思います。
実装をみながら解消方法をみていきましょう。

## フロント側の記述

フロント側は以下のようなコードにしています。

“`
$ yarn add file-saver
“`

“`tsx
import { saveAs } from ‘file-saver’;
~~

export const fil

元記事を表示

【Ruby on rails】JavaScript 非同期通信のコメント機能でエラーメッセージを出す バリデーション

初めに

非同期通信でのコメント機能は実装ずみで、「401字以上のコメント」はNGというバリデーションは、
かけていたものの、エラーメッセージが出るようにしていませんでした・・・。
少し実装に苦労はしたものの、非同期通信への理解が深まったのでまとめていきます!!

![スクリーンショット 2021-08-27 11.11.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/44f28078-ac76-b295-e17d-d303e000d722.png)

バリデーションをかけておく

“`perl:app/models/post_comment.rb
class PostComment < ApplicationRecord default_scope -> { order(created_at: :desc) }
# あるコメントに紐づくユーザーも記事も1
belongs_to :user
belongs_to :post

v

元記事を表示

【Ruby on Rails】デプロイ後、本番環境で画像が表示されない不具合を解消する方法

#対象者

* ローカル環境で表示される画像が本番環境で表示されない方

#目的

* 本番環境でも問題なく画像を表示させる

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

ruby 2.5.1
rails 5.2.5
AWS

* app/assets/imagesの中に画像が保存されている
* 自動デプロイできている状態

###2. 結論

変更前

““
#
““

↓↓↓

変更後

“`
<%= image_tag asset_path("search.png", alt: "") %>
“`

これで実装完了です!

###3.原因

本番環境では、画像もコンパイルされることが原因のようです。

※コンパイルとは、ソースコードを機械語に翻訳する作業のこと

本番環境ではパス名と画像の名前が変わっちゃうので
両方に対応できるasset_path()を使い、解決できました!

#参照

>[【ちゃんと理解してる?】コンパイル、ビルド、デプロイの違い](https://cheat.co.jp/

元記事を表示

【Ruby on Rails】gem, bundlerって?

# この記事について

この記事は、筆者がRuby on Railsを学習・使用する中で疑問に思った`bundle` コマンドについて、どういった意味があるのかという内容をまとめていきます。

まだまだ初学者ではあるので、なにか間違った理解等ございましたらぜひご指摘いただけますと幸いです。

# bundlerとは

プロジェクト内で使用するgemのパッケージ管理ツール。

gemのバージョンやgemの依存関係を管理してくれる「gem」

## bundlerの特徴

1. bundlerを使ってgemをインストールすると、gem同士の互換性を保ってくれる。
2. Gemfileという1つのファイルにgemを書くので、gemの管理がしやすい
3. Gemfileを使ってアプリごとにgemを管理できる
4. 環境ごとにインストールするgemを管理できる
5. gemの互換性を保ってくれる。Gemfileさえ共有すれば複数人での開発でもエラーを起こさない

参考

[https://pikawaka.com/rails/bundler](https://pikawaka.com/rails

元記事を表示

「Could not detect rake tasks!」Herokuでデプロイエラー(メモ)

#Herokuデプロイ時のエラーコード

“`
Could not detect rake tasks
ensure you can run `$ bundle exec rake -P` against your app
and using the production group of your Gemfile.
rake aborted!
NameError: uninitialized constant Dotenv
“`

#解決方法

Gemfileの開発環境のテストに`dotenv-rails`を追加

“`
group :development, :test do
gem ‘dotenv-rails’
end
“`

`config/application.rb`に以下を追記

“`
Bundler.require(*Rails.groups)
if [‘development’, ‘test’].include? ENV[‘RAILS_ENV’]
Dotenv::Railtie.load
end
“`

以上。

元記事を表示

OTHERカテゴリの最新記事