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

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

【やっとわかった】self.っていつ使うん?(実務コードから見たクラスメソッド、インスタンスメソッドの使い分け)

## はじめに
Rubyのコードでたまに**self.name**みたいな感じでselfがついているコードをしばしば見かけるときがあります。Java、C#、Javascriptだとthisみたいなものですが、そもそもこのselfって「何を意味してるの?どんなときに使うの?」と疑問に思っていました。

今回Rubyの参考書でチェーリー本として有名な[プロを目指す人のためのRuby入門](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E6%94%B9%E8%A8%822%E7%89%88-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%

元記事を表示

Railsでdb:migrateやdb:rollbackができなくなったときの対処方法

# はじめに

この記事は2021年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

Migrateをする際にテーブルが外部のテーブルに依存する(外部キーなど)ときに、うまくmigrateやrollbackができないことがあります。一部レコードが外部キーを持っている状態のままレコードに入っていたりするので起きていることがあります

# 対処方法

まずは参照元、参照先のテーブルを削除していきます

“`
$ rails c
$ Model1.destroy_all
$ Model2.destroy_all
“`

ここではmigrateしたいテーブルにModel1とModel2が紐づいていると仮定しています

またmigrateは途中まで成功しているとロールバックしないので(migrateファイル単位で判断するので失敗したときにはそのファイルの内容のみをロールバックしているので成功したファイルはロールバックされない)、`duplicated`というエラーが出た場合は

元記事を表示

Railsで途中からDBをsqlite3からmysql2に変更するだけなのに死んだ

# 前提
– develop環境でsqliteを使うと、production環境(AWS)への移行が面倒そうなので、mysqlに変更しようと思った(本番はmysqlを使いたいから)
– まだ1度も`db:migrate`していない状態から作業した
– そもそも`rails new アプリ名 -d mysql`でデフォルトのDBをmysqlにできる
– ruby “3.1.2”
– rails “7.0.3.1”
– M1MacBookPro

# 最初の躓きポイント
– Gemfileからsqlite3を消し、mysql2を追加して`bundle install`でエラー
– `ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)`
– 原因はmysqlをPCにインストールしてなかったこと
– homebrewでmysqlをインストールしたらパス

# 次の躓きポイント
– config/database.ymlをmysql用に書き直す
– 具体的には、`

元記事を表示

windowsでdockerのvolume指定するときに環境変数使ったら;Cついてくる問題

対処ができればとりあえず良いと思うんで事象と対処について説明
### 環境
windows
vscodeでgitbash使用
docker desktop使用
### 事象
イメージ作って以下コマンド実行
“`
docker container run -it -p 4567:4567 –name sinatra -v “${PWD}/srcs”:/var/www sample/sinatra:latest
“`
↓file sharing エラー発生(これは大したことないが)
“`
docker: Error response from daemon: user declined directory sharing C:\Users\S724\Downloads\github\docker_ruby_yamaura\docker\src;C.
↑なんかパスの末尾に;Cついてるうう
“`
心配になりつつfile sharingの設定をdocker desktopで設定
すると。。。
src;Cファイルが実際に作成されてしまっていたのです。
さらにファイル作ったりしてもdock

元記事を表示

“||”はどんな時に使うのか?

はじめに

ポートフォリオを作成していく中で、「これ何してるの、、?」というコードに出会うことがしばしばあります。
やはり何をするにも土台が大切だろうと言うことでわからないことを一つ一つ調べて備忘録として残していこうと思います。
千里の道も一歩から!

or演算子

左辺を最初に評価し(真偽値かどうか調べる)、偽だった場合に右辺を評価する。
~~~rb
# trueを返す
false || true

#3は真なので左辺で3を返す
3 || 5

# trueを返す
false || nil || true

#trueを返す(trueの箇所で評価は終了。nilの箇所は評価すらしていない)
false || true || nil
~~~

自己代入演算子

aが偽か未定義だった場合、aに左辺(今回はhoge)を代入する。

~~~rb
#hogeが返ってくる
a ||= hoge
puts a #=>hoge

#hogeが返ってくる(既にaにはhogeが代入されているので、pogeは代入されない)
a ||= poge
puts a #=>hoge
~~~

元記事を表示

配列をネストしたブロックに変換する

# やりたいこと

配列をネストしたブロックに変換したい。

たとえば、ブロックを受け取る transaction という共通の名前のクラスメソッドを持ったクラス CuteDB, CoolDB, EpicDB があるとして

“`rb
nested_transactions([CuteDB, CoolDB, EpicDB]) do
hoge
end
“`

“`rb
CuteDB.transaction do
CoolDB.transaction do
EpicDB.transaction do
hoge
end
end
end
“`

という構造に変換したい。ネストする順番を動的に決定するのが目的。

# 方法

Proc オブジェクトと Enumerable#inject を利用する。

(@kts_h さんのコメントのおかげで nested_transactions メソッドの実装がシンプルになりました :pray::sparkles:)

“`rb
module CuteDB
def self.transaction

元記事を表示

ポートフォリオとして家事×バトルというwebアプリを作った。

# はじめに
ポートフォリオとして作成したWebアプリケーションの紹介記事です。

作成したアプリの概要
– 「家庭内の家事分担割合を可視化する」ことを目的に作ったWebアプリケーションです。
– サービス名は「家事×バトル」としました。
![スクリーンショット 2022-08-19 9.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948501/343208f9-01bb-2b68-0dae-be9e1cc9e3ca.png)

日々家事をこなしていると、夫と妻どちらが家事を多く実施しているか、客観的に評価することが難しいと思い、
実施した家事の量を集計して、比較することができるアプリを作成しました。

アプリのURLはこちらです。
https://kazi-battle.herokuapp.com/

githubのソースコードはこちらです。
https://github.com/shosuke1989/kazi-battle

# アプリの使用方法
別ページにまとめました。以下のリンク

元記事を表示

【Rails】nilを最後にソートしたい

## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16

## 状況
“`User“`を“`Post“`の“`category_id“`の降順かつ“`nil“`を最後にソートしたいとき、このように書くと

“`ruby
User.eager_load(:posts)
.order(‘posts.category_id IS NULL’)
.merge(Post.order(category_id: :desc))
.select(‘users.*’, ‘posts.category_id AS posts_category_id’)
“`

下記のエラーと
“`
for SELECT DISTINCT, ORDER BY expressions must appear in select list
“`

下記の警告が出る。
これについては伊藤さんの記事がとても参考になりました。

“`
DEPRECATION WARNING: Dangerous query method (method who

元記事を表示

Python,Ruby,PHP,Java,JavaScript,Perlの文字列処理の比較

Python,Ruby,PHP,Java,JavaScript,Perlの文字列処理の比較

# Python

https://qiita.com/tomotaka_ito/items/594ee1396cf982ba9887

# Ruby

https://qiita.com/kyohei-horikawa/items/b3308601931c20074c31

# PHP

https://qiita.com/chimayu/items/9b9cb14548aa7dd8da1b

# Java

https://qiita.com/suema0331/items/a3c947076ee1a0c6037a

# JavaScript

https://qiita.com/saka212/items/11ce1f1d6316c1fbf15b

# Perl

https://perlzemi.com/blog/20161003147558.html

元記事を表示

Webpacker動かない

rails sしてプレビューすると
~~~ruby
Webpacker::Manifest::MissingEntryError in Homes#top
Showing /home/ec2-user/environment/Rails6_ojt_test/app/views/layouts/application.html.erb where line #9 raised:

Webpacker can’t find application.js in /home/ec2-user/environment/Rails6_ojt_test/public/packs/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment
unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to re

元記事を表示

resources :~, only: %i[index] の”%i”は何者なのか

はじめに

ポートフォリオ作成で参考にしたコードで、ルーティングの設定を記述する際に”%i”という文字列が出てきて、どんな意味が分からなかったので調べたものを備忘録として残そうと思います。

%iとは何者なのか

どうやら、”%i”は「%記法」(パーセント記法)という形式の記法の中の一つのようです。

%iを使用することによって、シンボルの配列を作成してくれます。

https://railsdoc.com/page/symbol_info

例を見た方がイメージが湧くかもしれません。

~~~rb
# 例:
%i[red blue yellow white black]
# 下記の配列が作成される
[:red, :blue, :yellow, :white, :black]
~~~

%iを使用することにより、”:”を記述せずに配列を作り使用することができるということでした。

なので、今回の最初に疑問を持った式を使用すると、下記のようになります。
“:”を書く手間を省いたと言うことですね。

~~~rb
resources :~, only: %i[index]
# 下記

元記事を表示

エラーメッセージの日本語化についての実装

①まず初めに、日本語の言語設定を行う

# 日本語の言語設定
config.i18n.default_locale = :ja

# config/application.rb
# 日本語の言語設定
module Pictweet
class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 6.0 config.i18n.default_locale = :ja # 省略 end end ②日本語に対応する"rails-i18n"というGemを導入します。 # Gemfile  gem 'rails-i18n' # ターミナル  bundle install ⚠️この段階では、まだ完全に日本語化しきれていません。 ③c

元記事を表示

【jQuery】ドロップダウンの開閉(クラスの変化)をトリガーにCSSの変更を動的に実装

# はじめに
ドロップダウンを開いた時に、cssを変更する操作を動的に行いたい。
railsのアプリ環境で行う。

# 環境
| No | 項目 | 内容 |
|—:|————-|————|
| 1 | OS | Mac |
| 2 | Ruby | 2.6.3 |
| 3 | rails | 6.0.4 |
4|jquery-rails|4.5.0
# 実装
[こちら](https://ayaka-weblog.com/programming/html-css-programming/wai-area-accordion/)の記事を参考にjsファイルを書いた。

# jsファイル読み込み設定
全ページにjsファイルを読み込むように設定する。
“`app/javascript/packs/application.js
// app/javascript を起点に記載
require (‘user/dropdown’)
“`

元記事を表示

なぜcreateメソッドのparamsのみparams.requireメソッドが代入されるのか。

理解が曖昧だったため、整理のために記事を投稿。

それは**createメソッド**とそれ以外において、役割が異なるためである。
また、ここでは、newとindexメソッドは省く。

**createメソッド**の役割は、newのviewにおいて記載され、**ストロングパラメーター**となった(許可された)情報を取得し、保存することにある。
そのため、データベースのテーブルから、レコードを一つ取り出すメソッドであるfind(params[:id])は使えない。
そのため、**createメソッドに対し、params.requireの中身を代入すること**になる。

“`ruby:task.controller.rb

def create
@task=Task.new(task_params)
if @task.save
redirect_to tasks_path, notice: “作成しました”
else
render ‘new’
end
end

private

元記事を表示

JSONを受け渡しするRails APIのrequest specの書き方

# はじめに
一部React化で久しぶりにAPIを作成しました
JSONを受け渡しするRails APIのrequest specの書き方まとめです :sparkles:

## headersにContent-Typeを追加する
headersに`’Content-Type’ => ‘application/json’`を追加する
これでJSONのparamsを渡すことができるようになります

追加しないとデフォルトでは
`”CONTENT_TYPE”=>”multipart/form-data”`となり
数値やbooleanが文字列に変換されてしまいます
“`rb
describe ‘PATCH #update’ do
subject { patch xxx_path(article), headers: { “Content-Type” => “application/json” } }

end
“`

## JSONのparamsを用意する
“`rb
let!(:params) { { name: ‘タイトル’, body: ‘本文’ }

元記事を表示

【Ruby】1次元配列を2次元配列に変換する実装方法

## はじめに
多次元配列を1次元配列に変換するには`flatten`メソッドを使用すればよいですが、その逆の1次元配列を多次元配列にするメソッドはないなと思い、実装してみました。
多次元配列と言いながら、今回は2次元配列に変換する方法になります。
## 実装
“`ruby:.rb
puts “カンマ区切りで複数の数値を入力してください”
input_array = gets.chomp.split(“,”)

puts “2次元配列の行と列のどちらを固定しますか?(’行’or’列’を入力してください)”
select = gets.chomp

# 列が選択されたときの行と列の数を算出
if select == “列”
puts “列数を入力してください”
new_column = gets.chomp.to_i # 2次元配列の列数
new_line = ((input_array.count)/new_column.to_f).ceil # 2次元配列の行数
end

# 行が選択されたときの行と列の数を算出
if select == “行”
puts “行数を

元記事を表示

RubyInstaller 3.1.2-1はまずgem install bundlerしましょう

言いたいことはタイトルで完了したので以下発生した問題と原因・解決方法です。

# 問題:rails newが通らない

ちょいと検証したいことがあって`rails new`しようと思い、devkitなしのバージョン入れてたことに気づいて(ネイティブライブラリビルドするgemがインストールエラーになって)、ついでなのでRubyInstallerでRuby 3.1.2を入れました。

で、`rails new`したところ、`bundle install`は通ったもののその後の処理でエラーが出てしまいました。

“`
rails importmap:install
rails aborted!
TZInfo::DataSourceNotFound: tzinfo-data is not present. Please add gem ‘tzinfo-data’ to your Gemfile and run bundle install
C:/TEMP/sample_app/config/environment.rb:5:in `

Caused by:
TZ

元記事を表示

【Rails】ヘッダーのドロップダウンをレスポンシブ対応

# はじめに
[こちら](https://qiita.com/vaza__ta/items/921b748df585bbbb4300)の記事で、ヘッダーをレスポンシブ対応するため、overflow-x: autoを実装した。
それにより表示領域から溢れた時はスクロールバーが表示されるようになった。

しかし、それによってドロップダウンの表示もスクロールバーが表示されるようになってしまった。
![scroll1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/c1bfb901-6074-ca79-6b91-1229582efdc9.gif)

そこで、スクロールバーに対応するoverflow-xの適応を、ウィンドウサイズの横幅が750px以下の時にのみにすることにした。理由としては下記となる。
・約770px以下からbootstrapによってヘッダーの表示フォーマットが変わる
・それ以下の750px以下であれば、overflowを設定してもドロップダウンがスクロールバー表示にならない
![s

元記事を表示

【Rails】gemのkaminariと配列を併用する場合について

## はじめに
ページネーションを実装する時にkaminariを使用することが多いと思います。
しかし、その前に取得したレコードを操作して配列になっていたりすると、そのまま`.page(params[:page])`を適用させることはできません。
このようなケースが個人開発であったのですが、応用的な使い方を知らず少々つまずいたので、今回記事に残しておくことにしました。

## やりたいこと
– Itemモデル全体をシャッフルして表示する
– 表示は、ページネーション対応で1ページに5個までにする
– kaminariのインストールは[こちら](https://qiita.com/you8/items/df68aaee3010e282d1ae)が参考になります

## 開発環境
Ruby 3.1.2
Rails 6.1.6

## 実装
そもそもページネーションを適用しないのであれば、shuffleメソッドを使用するだけで完了します。
“`ruby:items_controller.rb

def index
@items = Item.all.shuffle
end

.

元記事を表示

【Ruby】Faebook広告のデータをAPIで取得する

# 環境

Ruby 2.6.6
Rails 6.0.4.7
Gem facebookbusiness(Metaが出している公式のSDK)
(※ ググるとgem ‘facebook_ads’などが出てくるが、そちらではないことに注意)
API version v14.0(2022年8月最新)

# やりたいこと
1. Meta for DeveloperのAppにアクセス許可を渡しているすべての広告アカウントを取得する
2. それぞれの広告アカウントの、昨日のパフォーマンス(インプレッション、クリック、コストなど)を取得する

# ビジネスのちょっとした背景

ウチの会社はweb広告に力を入れていて、すべての事業のfacebook 広告アカウントを足すと使っていないものも含めて80アカウントくらいある…。(広告代理店かってくらい)

以前は各アカウントの担当者が毎日毎日手作業でgoogle spreadsheetに情報を入力して、ピボットやシートの連携で集計して、目視で確認して…とだいぶ作業が煩雑になっていた。それを、facebookのapiを叩いてspreadsheetの入力まで自動

元記事を表示

OTHERカテゴリの最新記事