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

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

▸ Error: docker build exited with Error: 1 & executor failed running [/bin/sh…] : exit code: 100 の対処法

だれでもエンジニア / 山浦清透 さんの[Docker超入門講座 合併版 | ゼロから実践する4時間のフルコース](https://www.youtube.com/watch?v=lZD1MIHwMBY)を拝見している時に、

“`:Command
Error: docker build exited with Error: 1
“`
とエラーが出てしまいました。。

#検証 1

https://qiita.com/akira-i/items/54462f5bd7fca868a818

を参考にしてVersionを変更してみましたが、エラーは解消されず。
https://gyazo.com/36e0631b46d5efc80180f35bcc338abc
ubutuの時は、バージョン変更でいけるらしいが、Rubyはどうやら違うぽい。

#検証2
Errorコードをよく見てみると

“`
ERROR [2/7] RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add – && echo “de

元記事を表示

Railsのid列は必ずしもきれいな連番にはならないんですよ、という話

## はじめに
Railsでモデルを作ると、テーブル定義上のid列(プライマリーキー)はデフォルトで自動的に連番が付与されるカラム(auto increment値)になります。

とはいえ、idにしたからといって必ずしも連番になるとは限りません。場合によっては「歯抜け(ギャップ)」が発生こともあります。
そのため、「idの最大値=そのテーブルの件数」になるとは限りません。

つまり、こういうデータが作成されることもありうる、ということです(たとえ一度もDELETEされなかったとしても)。

| id | name |
|—-|——-|
| 1 | Alice |
| 2 | Bob |
| 5 | Carol |

そこでこの記事ではRDBMS別にidの連番が歯抜けになるケースを見ていきます。

## この記事で使用するサンプルアプリ
この記事で使用するのは以下のようなモデルを1つだけ持つ、単純なRailsアプリです。

“`ruby
class Item < ApplicationRecord end ``` ```ruby:db/schema.rb A

元記事を表示

アプリを作る アカウントを有効化する

###app/models/user.rb
“`app/models/user.rb
class User < ApplicationRecord # 継承させる attr_accessor :remember_token, :activation_token before_save :downcase_email before_create :create_activation_digest validates :name, presence: true, length: { maximum: 50 } VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i validates :email, presence: true, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: fals

元記事を表示

【Ruby】dynamic constant assignmentというエラー

#状況
ページタイトルをapplication helperを使って動的に表示するために、以下のコードを書いた。

“`ruby:application_helper.rb
def full_title(page_title)
BASE_TITLE = “title”
BASE_TITLE.freeze
if page_title.empty?
BASE_TITLE
else
page_title + ” – ” + BASE_TITLE
end
end
“`
ここで、BASEE_TITLEは定数であるため、UPPER_CAMEL_CASEで定義している。
またrubyにおける定数は再定義ができるソフトな(破壊的変更が可能な)代物なので、再定義ができないようにfreezeメソッドを使って凍結しておいた。

実行した結果、
syntax errorとして以下のエラーが表示された

“`
dynamic constant assignment
BASE_TITLE = “title”
^~~~~~~~~~
“`
#対処法
メソッドの外で定数を定義

元記事を表示

RSpecでit / example / specifyはどのように使い分けるのか?〜日本語で書くならexampleって本当?〜

## はじめに

最近ときどき「RSpecで`it`/`example`/`specify`をどのように使い分けたら良いのか」という話題を見かけるので個人的な私見を書いてみます。

## 使い分けに何か決まりはあるのか? → 技術上の決まりは何もありません

`it`/`example`/`specify`は技術的にはまったく同じメソッドです。なので、`it`を`example`や`specify`に置き換えても問題なく動きます。

“`ruby
# itを使う
it ‘adds numbers’ do
expect(1 + 1).to eq 2
end

# itの代わりにexampleを使う
example ‘adds numbers’ do
expect(1 + 1).to eq 2
end

# itの代わりにspecifyを使う
specify ‘adds numbers’ do
expect(1 + 1).to eq 2
end
“`

日本語と英語で使い分けが必要、なんてこともありません。

“`ruby
# itを使う
it ‘数値を加算する

元記事を表示

error: failed to push some refs to “URL”が治らない….

#Herokuを用いたデプロイ時のエラー原因が、「メインブランチ以外で作業を行なっていたこと」だった件

チーム開発でGithubを用いながらWebアプリケーションの開発を行なっていた時に行き詰まってしまったエラーを共有します

###状況
Ruby on Railsで作成したアプリケーションをherokuにデプロイしたい!!

“`:terminal
voclabs:~/environment/railsアプリ名 (testbranch) $ git push heroku main
“`

Herokuを用いてRailsのアプリケーションをデプロイするときに何回やっても下記のようなエラーが出てしまう

“`:terminal
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to ‘URL’
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: c

元記事を表示

rubyでの改行

rubyで、\nのようにして改行する方法は知っていたのですが、ほかにも改行するやり方があったので、それを紹介しようとおもいます。

##+を使った際の改行
“`
p (2+
1)
=> 3

p (2\
+1)
=> 3

p(2
.+1)
=> 3
“`

##文字列とシンボル、そして数値を改行する

“`
p “ho\
ge”
=> “hoge”

#\の直後にスペースが入っている
p “hoge\
ge”
=> “hoge \nge”

p :”ho\
ge”
=> “hoge”

p 10\
1
=>SyntaxError
“`

##ピリオドによる改行

“`
p 3.
to_s
=> “3”

p 3
.to_s
=> “3”
“`
ピリオドの場合は、ピリオドが改行前にあるか、改行後にあるかは関係ないんですね。

##メソッドを使うときの改行

“`
def hoge(a);
p “hoge:#{a}”
end

hoge(1)
=> “hoge:1”

hoge(
1)
=> “hoge:1”

hoge\
(1)
=> “hoge

元記事を表示

【Rails】form_withで送信した値をparams[:◯◯◯]を使ってコントローラーで取り出す方法。

フォームに入力した値をコントローラーで取り出したいことがよくあるのですが、いつも忘れてググっているのでメモに残しておきます。

##結論
###送信したデータ一式

“`
params[:<送ったモデル名>]
“`

###特定のカラムのデータ

“`
params[:<送ったモデル名>][:<カラム名>]
“`

##具体例

例えば、フォームが以下のような場合。

“`
<%= form_with(model: @glider_flight, local: true) do |f| %>
# フォームの各パーツ
<% end %>
“`

`glider_flight`というモデル宛てにデータを送信したら、コントローラーでは

“`
  params[:glider_flight]
“`

と記述する。

binding.pryで処理を止めて中身を確認すると、次のようなデータが取れていました。

“`
=> #“2022-02-08”, “departure_and_arrival_

元記事を表示

たった10行で簡単に絞込みセレクトボックス(Javascript無し)

# 親子セレクトボックス

1番目のセレクトボックス(ドロップダウンリスト)で選択すると、2番目のセレクトボックスで選択肢が絞り込まれる、あれです。(正式にはなんというのかわかりませんでした。ドリルダウン?)(とりあえず、1番目を親セレクタ、2番目を子セレクタと呼びます)

例としては、親セレクタで都道府県名を選択すると、その都道府県内の市町村に子セレクタの選択肢が絞り込まれるというありがちなパターンです。

その親子セレクタが、Rails 7 で採用された [Hotwire](https://hotwired.dev/) ([Turbo](https://turbo.hotwired.dev/)) であれば、**ものすごく簡単**に実装できます。トータルで10行くらいです。Javascript は使いません(HTMLとJavascriptの知識は必要。)
環境を Rails 7.0.1 と Ruby 3.1 として、例を作成しながら説明します。

![window.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.c

元記事を表示

【Rails】where.notを連結するしないでクエリが異なる

下2つは同じクエリを吐き出すと勘違いしていたので備忘録。

“`ruby
where.not(tag: ”, user_id: 1)

where.not(tag: ”).where.not(user_id: 1)
“`

##where.notを複数連結

画像左

“`ruby
Post.where.not(tag: “Ruby”).where.not(user_id: 1)
=> SELECT `posts`.* FROM `posts` WHERE `posts`.`tag` != ‘Ruby’ AND `posts`.`user_id` != 1
“`

##連結しない
画像右

“`ruby
Post.where.not(tag: “Ruby”, user_id: 1)
=> SELECT `posts`.* FROM `posts` WHERE NOT (`posts`.`tag` = ‘Ruby’ AND `posts`.`user_id` = 1)
“`

![math.jpeg](https://qiita-image-store.s3.ap-n

元記事を表示

【Rails】お気に入り一覧ページでお気に入りを削除した際に、お気に入り一覧ページに戻る(元のページに戻る方法)

エンジニアを目指して、学習参考書のレビューサイトのポートフォリオを作成しています。
自分の備忘録かつ、似たような問題に直面した方の助けに少しでもなれるよう、記事を書かせていただいています。
間違いや問題、より良い方法などがありましたら、ぜひご指摘お願いいたします。

##直面した問題: お気に入り一覧に戻れない
参考書のお気に入り機能を追加し、「お気に入り一覧で参考書のお気に入りを削除→お気に入り一覧に戻る」という動作を実装しようとして、壁に当たりました。

それまでは、

“`ruby:favorite_books_controller.rb
@favorite_book.destroy
flash[:success] = “お気に入りから削除しました”
redirect_to @book
“`

としていました。

このようにした場合、**「参考書詳細ページでお気に入りを削除→参考書詳細ページに戻る」**という場合はこれで問題ありませんが、**「お気に入り一覧でお気に入りを削除→お気に入り一覧に戻る」**という動作が実現できませんでした。

元記事を表示

Rails【まとめ】

#データベース

データベースを一度削除して初期化

“`
rails db:migrate:reset
“`
→database “api_development” is being accessed by other users
データベース構造を前に戻す=ロールバック

“`
rails db:rollback
“`
###データベースを操作

“`
rails dbconsole
.table
.schema users(スキーマ=構造)
.quit
“`

“`
rails c
Post.find(1).destroy //id1を削除
“`

|用語|意味|
|–|–|
|マイグレーションファイル=|データベースを生成する際の設計図|
|レコード|一行!横!|
|||
|||

rails db:migrate:status

元記事を表示

Railsチュートリアル7章、本番環境へデプロイ出来ない原因なんてこんなもんよ

https://wa3.i-3-i.info/word16767.html

デプロイとは使える状態にする。ということである。
わわわ事典より。

一向に使える状態になりません。困りましたねぇ。

“`$ push heroku“`

アプリにアクセス…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2144713/0a83c1fb-53cf-b2b9-7e32-c5470f9eda83.png)

wtf!
“`$ rails test“`
0 failures, 0 errors, 0 skips

問題ないですね。
原因が絞られてきました。

まず、こちらを参考に

https://qiita.com/kents1002/items/e1b90c71897c55b8e870

うんうん同じ画面です。
“`$ heroku logs –tail“`(リアルタイムのログを追跡して確認)

“`$ heroku restart“`
うーん
sqlite3は関係ないし

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事