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

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

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

元記事を表示

【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オプションをつけて開発をするといいと思います!!

元記事を表示

OTHERカテゴリの最新記事