Rails関連のことを調べてみた2022年02月08日

Rails関連のことを調べてみた2022年02月08日

flattenメソッドについて

##flattenメソッド
flattenという英単語は、均す(ならす)という意味です。
flattenメソッドとは、多次元配列を1次元配列に変えるメソッドなんです。
実際にコードを見ていきましょう

“`
arr = [1, 2, 3, [6,8], 9]
arr.flatten
=> [1, 2, 3, 6, 8, 9]
“`
上記の例をみると、多次元配列が、1次元配列になっています。

このメソッドは配列だけでなく、ハッシュでも使われます。ハッシュで使われると、1次元配列にしてくれます。
実際にコードを見ていきましょう

“`
hash = { ‘hoge’: 100, ‘fuga’: 200 }
hash.flatten
=> [:hoge, 100, :fuga, 200]
“`
このようにハッシュでも1次元配列にしてくれるメソッドなんですね。

多次元配列じゃない配列に破壊的メソッドであるflatten!を適用すると、nilが返ってくるんです。

“`
[‘hoge’,’fuga’,’hogehoge’,’fugafuga’].flatten!
=> nil
`

元記事を表示

Rubyの自己代入(||=)について

実務をこなしていく中で、自己代入を使ったコードをよく見るので、それを解説していきます。

例えばこんなコードです。

“`
a = ‘hoge’
b ||= ‘fuga’
b
=> “fuga”
“`
このコードでは自己代入が使われています。この自己代入とは
**左辺の変数が、nilもしくはfalseのとき||=の右辺にある値を代入する**という意味です。
上記のコードでいえば、変数bがnilもしくはfalseのときfugaという文字列を変数bに入れてくださいね、という意味になります。
変数bはそれに当てはまるので、bにはfugaという文字列が入ります。

下記のようなコードを書いて見ましょう

“`
a = ‘hoge’
a ||= ‘fuga’
a
=> “hoge”
“`
上記のコードでは、aはfalseでもnilでもないのでfugaはaに代入されません。

“`
a ||= 10
“`
上記のコードは、

“`
a || a = 10
“`
このように論理演算子で考えると分かりやすいとおもいます。論理演算子の理解があやふやな方は、[こちら](https://qi

元記事を表示

public_sendとsendの違い

実務をしていく中で、public_sendとsendというメソッドが出てきたので、詳しく調べたので、記事にしようとおもいます。

結論からいうと、privateメソッドを呼び出せるか否かの違いなんです。
詳しく解説していきます

##privateメソッドとは
privateメソッドと普通のメソッド(クラスメソッドやインスタンスメソッド)の違いは、他のクラスで使えるかどうです。
実際に具体例を見ていきましょう

“`
class Test
def public_method
puts ‘publicメソッドだよーん’
end

private

def private_method
puts ‘privateメソッドだよーん’
end
end

class Test2
def public_method2
puts ‘これもpublicメソッドだよーん’
end

test = Test.new
test.public_method
=> publicメソッドだよーん

 test.private_method
 =>

元記事を表示

Ruby Threadについて

##Threadとは?

メインのプログラムを読み込む作業と並列して実行されるrubyのプログラムのことです。
実行したいプログラムを分担するようなイメージですね。

その並行して実行させているプログラミングのことを並行プログラミングといいます。

##Threadの種類と、それの作り方
Threadには、プログラムが開始されたときに実行されるmainThreadや、現在実行されているcurrentThreadなどがあります。

実際にそのコードを打ってみましょう

“`
p Thread.main
=> #

p Thread.current
=> #
“`
自分の実行環境では、スレッドを作ってないため参考にならないかもしれませんが、違う数字が返ってくることもあります。

では、実際にあらたなスレッドを作ってみましょう。
スレッドの作り方はnew, start, forkを使って、その後ろにブロックをつけてあげることで生成することができます。

“`
Th

元記事を表示

sortメソッドと<=>の解説

##sortメソッド
sortとは、日本語で「並び替える」という意味です。つまり、sortメソッドとは、ある一定の基準で並び替えるメソッドです。
実際に具体例を見てみましょう

“`
ary = [4, 2, 9, 8, 3, 16, 10]
p ary.sort
=> [2, 3, 4, 8, 9, 10, 16]
“`
sortメソッドは、デフォルトで昇順に並び替えるメソッドです。上記の例では、配列の中身が昇順で並び変わっています。

降順で並び替えるには、2つの方法があります。
➀reverseメソッドを使う
➁<=>演算子を使う
順に説明していきましょう

##➀reverseメソッド
reverseとは「反転する」という意味です。つまり、reverseメソッドは、配列やハッシュなどの値を反転させるメソッドなんです。
実際にコードを書いてみると以下のようになります。

“`
ary = [4, 2, 9, 8, 3, 16, 10]
p ary.sort.reverse
=> [16, 10, 9, 8, 4, 3, 2]
“`
このように書けます。個人的にはメソッドを

元記事を表示

[初心者log]Rails, RSpecにてPostの単体テスト

#本記事の目的
RSpec,Factry_botを用いてUserモデルと関連付いたPostモデルの単体テストを書いたので記事としてまとめておきます。

##Postのカラム
“`xxx_create_posts.rb
class CreatePosts < ActiveRecord::Migration[6.1] def change create_table :posts do |t| t.integer :post_field t.string :content t.references :user, foreign_key: true t.timestamps end add_index :posts, [:user_id, :created_at] end end ``` ##Postのモデル ```app/model/post.rb class Post < ApplicationRecord belongs_to :user validates :user_id, presence:

元記事を表示

【Serializer】ActiveRecordを継承していないモデルのJSONレスポンスを整形したい

###返したいレスポンス

**本のタグ一覧API**

“`json
{
“book_tags”: [
{
“id”: 1,
“name”: “芥川賞受賞”
},
{
“id”: 2,
“name”: “ベストセラー”
},
{
“id”: 3,
“name”: “映画化決定”
}
]
}
“`

ActiveRecordを継承していないBookTagモデルのJSONは整形しないとこうなる。

“`json
{
{
“id”: 1,
“name”: “芥川賞受賞”
},
{
“id”: 2,
“name”: “ベストセラー”
},
{
“id”: 3,
“name”: “映画化決定”
}
}
“`

###Serializerを使わずにコントローラーでJSONを整形

“`ruby
class BookTagsController < Api::ApplicationCon

元記事を表示

【RSpec】インスタンス変数よりletを使う理由

そういえばRSpecではインスタンス変数使ってるのほとんど見かけたことないなと思ったことがきっかけで調べた。
その中でももっともらしいなと感じた理由のみ抜粋。

##インスタンス変数よりletを使う理由
(詳しいことは参考記事に)

– typoにすぐ気づける

letはtypoした場合“`undefined local variable or method“`のエラーがでる。
インスタンス変数の場合“`nil“`と評価されるため、インスタンス変数をtypoしたことにすぐには気づけない可能性がある。

####ちなみに
**let!** は即時にデータ作成される。
**let** は呼ばれて初めてデータ作成される。(遅延評価)
テストによって意図的に**let**を使って、呼ばれるまでデータ作成を行わない遅延評価を使うほうがいい場合もある。
「**let!**と**let**は使い分けずに、**let!**のみを使用したほうがよい」みたいな意見も見たことがあるけど、
脳死せずにそのときは何がベストなのかを考えて使い分けたい。

##参考

https://qiita.com

元記事を表示

インストール済みgemの特定ファイルの絶対パス確認方法

例: vendor/bundleをパスとしてbundle installしたrailtiesの特定ファイルのパスを確認したい

“`
$ bundle exec gem contents railties | grep rails/commands.rb
/home/yu_uchida/my_app/vendor/bundle/ruby/2.6.0/gems/railties-5.2.4.3/lib/rails/commands.rb
“`

 
 
 
comannds.rbの中身を見たいときは

“`
$ cat `bundle exec gem contents railties | grep rails/commands.rb`
# frozen_string_literal: true

require “rails/command”

aliases = {
“g” => “generate”,
“d” => “destroy”,
“c” => “console”,
“s” => “server”,
“db” => “dbcon

元記事を表示

【Rails】過去一週間でいいねされた数を多い順でソートする

#初めに
プログラミング初学者2ヶ月目です。
今回が初投稿となります。
自身の忘備録として記事を更新していこうと思いますので、もし間違いなどありましたらご指摘頂けると幸いです。

#アソシエーション
“`ruby:user.rb
has_many :books, dependent: :destroy
has_many :favorites, dependent: :destroy
“`

“`ruby:book.rb
belongs_to :user
has_many :favorites, dependent: :destroy
has_many :favorited_users, through: :favorites, source: :user
“`

“`ruby:favorite.rb
belongs_to :user
belongs_to :book
“`
userモデル,bookモデル,favoriteモデルのアソシエーションが完成しました。
has_many :favorited_users, through: :favorites, source: :

元記事を表示

railsのconfig_forで環境ごとに設定を切り替える

#環境
rails6

#はじめに
開発環境(development)と本番環境(production)で異なる設定値を持たせたい場合があります。むしろその方が一般的だと思います。
それぞれの環境で出力させるパスが違うとか、Titleを変えるとかの場合、いちいちif文を書きたくないですよね。

#ただの設定値として設定させたい場合
“`ruby:config/application.rb
module MyApp
class Application < Rails::Application config.hello = "hello" end end ``` 以下のように呼び出せます。 ```ruby: Rails.configuration.hello => “hello”
““
#環境ごとに設定を分けたい
####config_forを有効に
“`ruby:config/application.rb
module MyApp
class Application < Rails::Application #以下を追記するとconfig_for

元記事を表示

Carrierwaveでヘッダー指定のURLから画像を取得して保存する

# 概要
Carrierwaveを使用して外部サイトもしくはS3などから画像をダウンロードして保存する。
その際にヘッダーを指定する(今回はRefererのみ)

# 試したけどうまくいかなかったパターン
## open-uriでopenした画像を保存する
“`ruby
image_url = URI.parse(uri) # uriを直接openするとセキュリティ的に問題があるためURI.parseする
file = image_url.open(“Referer” => “https://…”)
user.avater = file
“`
値が入らず断念。tmpファイルに書き出してから行えばうまくいけるかも。

# 上手く行ったパターン
## carrierwaveのremote_#{column}_request_header=(header)とremote_#{column}_url=(url)を使用する
carrierwaveのソースを読むと以下のようなメソッドが定義されているので利用する
columnの部分はモデルの`mount_uploader`で指定したカラム

元記事を表示

Rails x Reactでapiモードを使うべき理由

##なぜapiモードがいいのか
結論:フロントエンドとバックエンドを完全に分離することができるから。

Rails x Reactで初めてのアプトプットとしてTodoアプリを作ったのですが、apiモードを利用しないとRailsにviewファイルを置く必要が出てきたり、コンポーネントフォルダとかもしっかりとRailsから分離して管理することができずかなり開発しにくかったです。rails newするときは–apiオプションをつけて開発をするといいと思います!!

元記事を表示

sprintfフォーマットの解説

##そもそもフォーマットとは?
フォーマットとは書式のことです。つまり、文字列や数値をどんな形式で表示させるかというのをきめるんです。
具体例を見ていきましょう

“`
n = 10
sprintf(‘%f’, n)
=> “10.000000”
“`
指示子に、%fをいれると、浮動小数点数(float)を出力します。他にも指示子があるので、[こちらの記事](https://k-koh.hatenablog.com/entry/2019/12/16/105428)を参考にしてみてください

##実際に問題を解いてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/15264d1a-91d7-e9ec-90bf-15fd1cd88349.png)

問題で出されているコードでは、% 5とあります。これは、指示子ではないので、% 5は無視されます。
そのため、表示されるのは、Helloと表示されるため、選択肢➁が正解です。

###選択肢➂
これは先ほどの説明から不

元記事を表示

Kernel#loadは何をしているのか

# loadの使い所ってどこなの?

いろいろあって気づいたら年が明けてしまいましたが、Ruby3.1出ています。
関連記事でもいろいろと紹介されている通り、irbやデバッガ周り、ハッシュの省略記法などが入ってますね!

遅ればせながら[プロと読み解く Ruby3.1 NEWS](https://techlife.cookpad.com/entry/2021/12/25/220002)を見ている時に、ふとこの仕様が目に止まりました。

> Kernel#loadの第二引数で任意のモジュールを指定できるようになった
>
> Kernel#load now accepts a module as the second argument, and will load the file using the given module as the top-level module. [Feature #6210]

へえ、このオプション、なぜloadだけに入ってrequireには入らないのだろう?
そもそもどういうユースケースのために作られた機能なの?

そんな疑問をかかえながら、動作を確認し

元記事を表示

自作アプリを作る アカウント有効化のメール送信

Userのメイラーを追加します。
このメイラーはUsersコントローラのcreateアクションで有効化リンクをメール送信するために使います。

“`
ubuntu:~/environment/my_app (account-activation) $ rails generate mailer UserMailer account_activation password_reset
Running via Spring preloader in process 12921
create app/mailers/user_mailer.rb
invoke erb
create app/views/user_mailer
create app/views/user_mailer/account_activation.text.erb
create app/views/user_mailer/account_activation.html.erb
create app/views/user_

元記事を表示

Vue.jsとRailsでユーザ作成時の422 Unprocessable Entityエラー

# エラー内容
RailsとVue.jsプロジェクトで、ユーザ登録機能を実装した際
「422 Unprocessable Entity」 というエラーが発生し登録できなかった。

エラーメッセージを検索してみたけれど、原因詳細はなかなか探せず。。。
と思っていたところ、下記参考記事を見つけて解決できた。感謝!!

https://qiita.com/baby-0105/items/fd563733d2b6b810a4dc#:~:text=%E5%8E%9F%E5%9B%A0,-CSRF%E4%BF%9D%E8%AD%B7%E3%81%8C&text=%E3%81%93%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E6%80%92%E3%81%A3%E3%81%9F,%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%A8%E8%80%83%E3%81%88%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

“`Ruby:渡したパラメータ
Started POST “/auth

元記事を表示

Webpacker から importmap-rails に移行した

## はじめに
### きっかけ
Rails アプリで使用していた [Webpacker](https://github.com/rails/webpacker) の開発が終了し、[importmap-rails](https://github.com/rails/importmap-rails) がデフォルトになったため。

Rails7 のリリース後、今後 importmap-rails がデフォルトになることが発表され、その後、Webpacker の[開発終了が発表](https://github.com/rails/webpacker/commit/16bba5d6ca862b950a002f19c10d12e4bf51a87b)されました。また、プリコンパイルが必要な環境向けの選択肢として [jsbundling-rails](https://github.com/rails/jsbundling-rails) などが公開されました。
Rails チームは Webpacker の開発を終了しましたが、後継のプロジェクトとして [Shakapacker](https://gi

元記事を表示

アイデア総数【195】個人開発アイデアまとめ【毎日更新】

## 今月の個人開発に使えるアイデアを人気順に抽出!
## ? ターゲット
– 個人開発のアイデアが欲しい人
– 自分のプロダクトを改善していきたい人人
– シンプルに他人のアイデアが気になる人

“`
アイデアとエンジニアのマッチングアプリ ideeeの最新アイデアを投稿中!
“`
https://www.ideee.tech/about?utm_source=qiita&utm_medium=post&utm_id=auto_post

## ? ランキング(コメント)
`直近1ヶ月でコメントが盛り上がったアイデアをランキング化`
### ? 1. [手作りチョコ提案くん](https://www.ideee.tech/ideas/2075?utm_source=qiita_auto_post&utm_medium=post&utm_id=2075)
**? : 0  ? : 6**  ? : 2022 / 01 / 21
`バレンタイン`
まきのさん  Twitter: [@maki_infra923](https://twitter.com/maki_infra923)

元記事を表示

【Rails 6】環境を指定してconsoleを起動する際に詰まったポイント

# はじめに
FactoryBotの挙動を確認するために`$ rails c`でコンソールを起動し`FactoryBot.create(:user)`等のコマンドを実行してもテスト用のDBに追加されなかった。
調べると、`console`コマンドにはいくつかオプションがありそこで環境を指定できることを知った。ただ実際に環境を指定してコンソールを起動したところエラーが発生したため本記事では環境の指定方法と詰まったポイント・解決方法を記録する。

#### 構成
**1. 環境の指定してコンソールを起動する方法**
**2. 詰まったポイント・解決方法**

#### 実行環境
Ruby 3.0.3
Rails 6.1.4
rspec-rails 5.0.2
factory_bot_rails 6.2.0

# 1. 環境を指定してコンソールを起動する方法
## consoleコマンド
* `console`コマンド(`c`と省略可能)でコンソールを起動することでRailsアプリケーションとやり取りすることが可能。

“`bash
$ rails c
Running via Spring

元記事を表示

OTHERカテゴリの最新記事