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

Rails関連のことを調べてみた2021年12月27日
目次

rails7で`to_s`の引数にシンボルでフォーマットを指定するとDEPRECATION WARNINGが発生する(`DEPRECATION WARNING: Integer#to_s(:currency) is deprecated. Please use Integer#to_formatted_s(:currency) instead.`)理由と対応

# 概要

rails7で`1000.to_s(:currency)`の様に、`to_s`の引数にシンボルでフォーマットを指定するとDEPRECATION WARNINGが発生するようになりました。

“`ruby
DEPRECATION WARNING: Integer#to_s(:currency) is deprecated. Please use Integer#to_formatted_s(:currency) instead.
“`

この変更はこちらのPRで追加されています。

https://github.com/rails/rails/pull/43772

# 理由
ruby3.1で`symbol`, `true`, `false`, `nil`, `0-9`への`to_s`メソッド使用時のパフォーマンスチューニングが行われました。

https://github.com/ruby/ruby/commit/b08dacfea39ad8da3f1fd7fdd0e4538cc892ec44

railsではactivesuportで複数クラスの`to_s`メソッドを

元記事を表示

【Ruby】クラスとモジュールの違いと使い分け

##クラスとモジュールの違い

– クラスはインスタンスが生成でき、モジュールはインスタンスが生成できない
– クラスは継承でき、モジュールは継承できない

##クラスとモジュールの使い分け

moduleをclassにincludeをして使用できるようにする、ミックスインでの例。
モジュールはクラス間でメソッドを共有することができる。
モジュールをクラスに組み込むことで、クラス定義にメソッドをコピー&ペーストしたのと同じようにモジュールのメソッドをクラスで利用できるようになる。
これは、特定のクラスで再利用したいメソッドがあり、かつ、それを一カ所に集めておきたい場合に便利。

“`ruby
module Cream
def cream?
true
end
end

class Cookie
include Cream
end

cookie = Cookie.new
p cookie.cream?
#=> true
“`

##参考

http://ruby-for-beginners.rubymonstas.org/advanced/modules.ht

元記事を表示

[Rails]Webアプリケーションしか作った事ない僕が、ネイティブアプリケーションを作りたい

#はじめに
初学者の私が、2ヶ月でRailsを学びWebアプリケーションを作れるようになりました。
IOSでリリースをするに至って
まずどのような知識が必要かをまとめる記事になっています。

##React Native

React Nativeは、iPhoneとAndroidどちらでも動かすことができる開発用フレームワークです。
JavaScriptで開発することができるため、JavaやSwiftが書けないエンジニアでも、React Nativeを使えばアプリ開発ができます。
React Nativeの開発言語は、JavaScriptです。そのため、JavaScriptのコードを書ければAndroidとiOSの両方で開発が可能になるフレームワーク

“`
Reactに慣れている人にとっては学習コストの低いReact Native
ネイティブエンジニアには、逆に学習コストが高くなると考えられます。
“`
##Flutter

FlutterはGoogleが作ったモバイルアプリ用のフレームワーク。
「Dart」という言語を使って開発をしていきます。

“`
モバイルアプリ開発

元記事を表示

Rails7+devise+omniauthでCORS policyで怒られた時

## 問題

“`erb
<%= button_to "Sign in with Google", user_google_oauth2_omniauth_authorize_path %>
“`

こうしたら、こうなりました。

“`
Access to fetch at ‘xxx’ (redirected from ‘http://localhost:3000/users/auth/google_oauth2’) from origin ‘http://localhost:3000’ has been blocked by CORS policy
“`

## 解決法

https://github.com/hotwired/turbo/issues/288

に習い、`data: { turbo: false }`をつけてTurboを無効にしましょう。

“`erb
<%= button_to "Sign in with Google", user_google_oauth2_omniauth_authorize_path, data: { turbo: false }

元記事を表示

Rails 7 のアプリケーション設定のnew_framework_defaults_7_0項目を適当に調査

2021年12月16日に公式 Twitter からもアナウンスされたように Ruby on Rails の新しいメジャーバージョンである `7.0` がリリースされたので、アップグレードする時の参考記事として書いてみました。アップグレードの手順と、Rails 7 へ完全対応するための `new_framework_defaults_7_0.rb` の調査をしてみたたので需要あれば良いなと。

なお、たまたまこの記事を公開する時に [Ruby on Rails Advent Calendar 2021](https://qiita.com/adv

元記事を表示

【Rails】画像アップロード機能の実装

##手順
①gem “carrierwave“と“mini_magick“をインストール
②uploaders/image_uploader.rbを作成
③uploadersとモデルの紐付けやデフォルト画像の設定、ファイル指定などの細かい設定
④モデルに新たなカラムを追加(例:Postモデルにpost_imageというカラムを新しく追加)
⑤viewの記入
⑥画像アップロードフォーム
⑦画像アップロードに関する日本語化の追加設定

##①gem “carrierwave“と“mini_magick“をインストール
###Carrierwaveとは
Carrierwaveとは、ファイルアップロード用のgem。
Ruby on Railsの画像投稿の仕組みで、よく使われるgemの1つ。

###MiniMagickとは
MiniMagickとは、画像処理ライブラリで、画像サイズ変更や画像反転などといった様々な画像処理を行うことができる。

前提として、 **MiniMagickを使うにはImageMagickというものをインストールする必要があるので注意。**

“`

元記事を表示

【Rails】NO FILEのマイグレーションファイルを削除する方法

## やりたいこと

マイグレーションファイルを確認したところ、完全に削除されていないマイグレーションファイルファイル(NO FILE)がたくさんあることに気づいた。
NO FILE状態のマイグレーションファイルを完全に削除したい。

## 解決方法
ターミナルで以下を実行

“`
rails db:migrate:status
“`
マイグレーションファイル一覧が表示される。
今回は一番上のマイグレーションファイルを削除することにする。(マイグレーションIDが20211112062400のファイル)

“`
Status Migration ID Migration Name
————————————————–
up 20211112062400 ********** NO FILE **********
up 20211112141152 ********** NO FILE **********
up 20211113070815 *********

元記事を表示

Railsでmysql2 gemのbundler installに失敗した時の対処法。LibreSSL→OpenSSLで解決

##経緯
ポートフォリオ用Railsアプリの作成のため、rubyとRailsおよびMySQLのインストールを終えてbundle installしようとしたところ下記のエラーが出て失敗。

“`
(中略)

Gem::Ext::BuildError: ERROR: Failed to build gem native extension. mysql2

(中略)

Don’t know how to set rpath on your system, if MySQL libraries are not in path mysql2
may not load
—–
—–
Setting libpath to /usr/local/Cellar/mysql/8.0.27_1/lib

(中略)

1 warning generated.
linking shared-object mysql2/mysql2.bundle
ld: warning: directory not found for option ‘-L/usr/local/opt/openssl/lib’
ld

元記事を表示

Railsのget formでパラメータを送信してもURLに表示されない

## やりたいこと
検索のパラメータをURLに表示させたい。

## やること
### formの作成
[Rails ガイド](https://railsguides.jp/form_helpers.html#%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA%E6%A4%9C%E7%B4%A2%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0)の通りにformを作成する

“`
<%= form_with url: "/search", method: :get do |form| %>
<%= form.label :query, "Search for:" %>
<%= form.text_field :query %>
<%= form.submit "Search" %>
<% end %>
“`

このままだとコントローラの `params[:query]` でデータを取れるがURLには何も表示されない。

### local: true オプションの追加

“`
<%= form_with url: "/sea

元記事を表示

rails7から`ActiveRecord::RecordNotFound`のメッセージでモデル名に加えてSQLも出力される様になった

# メモ

`ActiveRecord::RecordNotFound`は`ActiveRecord::Base.find`メソッドなど参照したデータが存在しない時に発生する例外です。

“`ruby
User.find(1)
“`

このエラーが発生したときに出力されるメッセージがrails7から変更されていました。

“`ruby
# Before
$ User.find(1)
=> ActiveRecord::RecordNotFound: Couldn’t find User with ‘id’=100
Caused by ActiveRecord::RecordNotFound: Couldn’t find User

# After
$ User.find(1)
=> ActiveRecord::RecordNotFound: Couldn’t find User with ‘id’=100
Caused by ActiveRecord::RecordNotFound: Couldn’t find User with [WHERE `users`.`id` IS NU

元記事を表示

データベース設計においてのインデックスの仕組み

# 結論

“`
「テーブルとは別に検索ように最適化された状態のデータ」
“`

データベースの性能を向上させる方法の一つです。

「探すレコードを識別するデータの項目」
「対象レコードの格納位置を示すポインタ」
で構成されており、これを利用してデータの格納位置を特定し、その位置を直接アクセスする事で、表の検索速度を上げることができます。

###Rubyにはindexメソッドがあります。

##indexメソッドの使い方

“`
オブジェクト.index(“検索したい部分文字列”)
配列の場合は、配列.index(“検索したい配列の要素”)
両者とも見つからない場合はnilが返す。
“`

## 終わりに
初学者です。理解しておくべき事と思い記録しました。
実際に使ったことがないので浅い知識だと思いますが、
また使ってみて、わかりやすく説明できたらと思います。

元記事を表示

【Rails】特定のカラムのデータを配列で取得する方法【初学者の疑問点を簡潔に解説】

## はじめに
 本記事は、プログラミングの学習を始めて1ヶ月の初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
 そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
 間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## 今回の疑問点
 今回の疑問点は、

  _データベースから特定のカラムを取得して、all?メソッドで判定する方法_
 
 です。 

## 疑問点についての解説

###結論
pluckメソッドを使用して配列でデータを取得し、all?メソッドで判定する。

###具体例

“`sample_app.rb

@Taro = User.where(name: “太郎”).pluck(‘age’)
@Taro.all?{ |w| w == ’20’ }

“`

上記のように記載することで、
`where`でnameカラムが太郎であるレコードを全て取得し、`pluck`でさらにageカラムのみに絞り、配列で取得します。
そして、`@Taro.all?{ |w| w == ’20

元記事を表示

類似gemを教えてくれるサイト

gemの選定時に知りたい情報No.1といえば、類似gemの一覧です(当社調べ(調べてない(当社もない)))。

しかしrubyに限らず類似ライブラリの検索というのは意外と難しく、GitHubで検索しようにもキーワードに上手く引っかからないケースが多いです。

導入後に、より要件にフィットする類似ライブラリを見つけたことのある人の割合はなんと三人に五人です(当社調べ(調べてない(当社もない)))。

検索してたら偶然こんなサイトを見つけ、共有したく、この記事を書きました。

(私以外の全人類が知っている情報でしたらすみません)

https://ruby.libhunt.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188872/844d7da3-e87e-b026-a101-766a3a3d8421.png)

類似gemの一覧、及び大雑把な比較情報を出してくれるサイトです。

例えばみんな大好き`Ruby on Rails`ですと、こういう情報が出てきます。

![imag

元記事を表示

2021年の振り返り@RailsGirls

この記事は、[Rails Girls アドベントカレンダー2021](https://qiita.com/advent-calendar/2021/railsgirlsjapan) 最終日の記事です。
Ruby3.1、リリースされましたね!

そして毎年、このアドベントカレンダーで、私自身のRails Girlsに関する振り返りを書いていますが、今年もいつもどおり、振り返ることとします。

## いちおう自己紹介
* Rails Girls Nagoya 1st〜5th オーガナイザー
* Rails Girls JPメンバー
* Rails Girls Nagoya、Naganoに出没。
* クマ好き。特にくまモンが好き。
* 最近自作キーボードに再び手を出し始めた・・・。

# 2021年のRails Girlsふりかえり
今年もCOVID-19の影響で、オフライン開催はなし。
来年こそは、できるといいなあ・・・

## Rails Girls Gathering Japan 2021 @ 2021.8.28
昨年に引き続き、オンラインイベントとして開催。
去年よりも参加人数も増

元記事を表示

Windows10 に Ruby on Rails の環境構築をしよう

## はじめに
3年ほど前、MacでRailsを使って開発を行っていましたが
現在仕事でMacを使用しないため寂しいことにRailsとも疎遠になってしまいました。年末でせっかく時間もあることだし、とWindowsにRails環境を構築してみようと思いたったため、作業ログとして残します。

## PCのスペック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397779/40feda6c-747b-60a2-7f72-fe65541b8b81.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397779/30ce886d-a11d-b7a2-b600-e0b921c2ba70.png)

メモリが圧倒的に低い!
なんとかなるのでしょうか・・・どきどき

## いざ、作業へ
### Rubyを手に入れる!

https://rubyinstaller.org/downloads/

元記事を表示

【Ruby on Rails】コントローラーでヘルパーメソッドを使用する方法

そもそもコントローラーからヘルパーを呼び出せないかな?と疑問に思ったので調べてみた。

# メソッド先頭にview_contextをつけるだけ
結論、コントローラーで「view_context」をつけるだけ。

“`app/helpers/sample_helper.rb
module SampleHelper
def helper_method
# 処理の内容
end
end
“`

“`app/controllers/sample_controller.rb
class SampleController < ActionController::Base def index # 呼びたい箇所で、先頭にview_contextをつけるだけ view_context.helper_method end end ``` 意外とあっという間にできて安心した。 ただ、本来はビューのヘルパーを無理矢理呼び出すよりは、 アプリケーション共通処理として切り出すやり方の方が良いよう。 詳細はこちら、[【Ruby on Rails】コントローラーで

元記事を表示

AWS EC2 AmazonLinux2の中にMySQLを導入したが、起動してくれない時の対策法(自分用メモ)

ローカル環境では、起動できていたMySQLなのですが、AmazonLinux2の配備した途端動かなくなってしまいました。

“`
[ec2-user@ip-10-0-0-165 WorkShare]$ sudo service mysqld start
Redirecting to /bin/systemctl start mysqld.service
Failed to start mysqld.service: Unit not found.
“`
というエラーが発生。

ググった結果、[AWS EC2 AmazonLinux2の中にMySQLを入れたがすんなり起動してくれず、いろいろやってターミナルからMySQLにログインできるようにした話(駄々流し)](https://qiita.com/miriwo/items/e7afd5e1ae0de94f27c2)と同じようような症状であることがわかったので、参考にさせていだきます!

“`
$ yum list installed | grep mariadb
“`
を実行。CentOS7には「MariaDB」がデフォルトで

元記事を表示

【Ruby】コピー時に元データがなぜか上書きされる【浅いコピー】

コピー先の変数の値を書き換えようとしたら、なぜか、コピー元の方まで値が書き変わってしまう謎現象に遭遇し、困ったのでメモ。

謎現象の原因を探るには「浅いコピー」「深いコピー」「参照渡し」という概念について、それぞれ理解しなきゃならないらしい。

なんでお前が書き換わんだよ!!!お前じゃないんだよ!!!!
と3時間ぐらい一人で格闘していたが、
浅かったのは、私の頭の方だった。

# 浅い頭を悩ませる「浅いコピー」
![【Ruby】コピー時になぜか上書きされてしまう【参照コピー、浅いコピー】.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1954103/66cc5e01-98a3-a1aa-2964-abd566a3cc5d.jpeg)

浅いコピーというのは、コピー元のオブジェクトとコピー先のオブジェクトがメモリ上の同一の場所を参照することになります。

っておい、なんじゃそれ :rage:

どうやら、参照先は一緒になるので、
片方に変更を加えると、もう片方のデータも変わってしまうらしい、

元記事を表示

Ruby on Rails 7の主要な新機能・機能追加・変更点

## はじめに

Ruby on Rails(以下Rails)の最新バージョンである7.0(以下Rails 7)が2021年12月15日に[リリース](https://rubyonrails.org/2021/12/15/Rails-7-fulfilling-a-vision)されました。

Rails 7では、JavaScriptフロントエンドの大幅な刷新、CSS BundlingによるTailwind CSSやPostCSSのサポートを含めた、メジャーバージョンアップグレードにふさわしい機能強化が行われています。

本記事では、[Railsの公式ブログ](https://rubyonrails.org/blog/)や[Railsガイド](https://edgeguides.rubyonrails.org/active_record_encryption.html)、GitHubのRailsプロジェクトの[Issues](https://github.com/rails/rails/issues)や[Pull Requests](https://github.com/rails/r

元記事を表示

N+1問題はincludesメソッドで解決できる

現在プログラミング勉強中です。
N+1問題について勉強していて、イメージがつき辛かったので備忘録としてまとめてみます。

#N+1問題とは

N+1問題とは、アソシエーションの関係にあるモデル間で、データベースへのアクセス回数が膨大になってしまうというものです。

例えばTwiiterなどでは、以下の画像のようにtweet毎に投稿者の名前が表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2378833/27280bcb-fe9c-9d63-8b18-ae586b66a5bd.png)

このようなtweet毎に紐づくユーザーネームを取ってくるためには、tweetの数分、usersテーブルにアクセスする必要があります。

具体的にコードを確認します。
まずは事前設定として、以下の表のようにアソシエーションの関係にある、
tweetsテーブルとusersテーブルを設定します。

![image.png](https://qiita-image-store.s3.ap-nor

元記事を表示

OTHERカテゴリの最新記事