- 1. 【Rails】booleanは実質メソッド!?と感じたこと
- 2. RuboCop::Cop::Rails::PresenceというRubocupの指摘
- 3. 自作言語でもRubyの map(&:foo) を真似したい!
- 4. 画像キャッシュを部分的に無効化する
- 5. ransackを使った検索機能実装
- 6. [個人開発]実際に飲食店で使う予約サービスを実務未経験者が1から考え作ってみた。
- 7. Ruby を書き始めてハマったこと
- 8. WHERE A and (B or C)をActiveRecordで記述する方法
- 9. サポートモジュールを使用したテストコードのまとめ
- 10. Rubyで気象庁過去データからのスクレイピング
- 11. 初学者:Rubyの初歩的なコードをまとめてみた。
- 12. Ruby メモ
- 13. Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. Learn more at)の倒し方
- 14. RSpecのテストコードの大まかな流れ
- 15. 【LeetCode】110. Balanced Binary Treeを解いてみた
- 16. Mailerでmissing templateになってしまった
- 17. SSLクライアント証明書を使ってRubyのFaradayで通信する方法
- 18. 【Docker】駆け出しエンジニアがDocker公式チュートリアルに躓きまくった件
- 19. Ruby 無限ループで each_with_index のようなカウント数を得る
- 20. Rubyでじゃんけんを作る プログラングの練習
【Rails】booleanは実質メソッド!?と感じたこと
# はじめに
Railsアプリケーション開発中にbooleanのカラムに対してこんなコードに遭遇した
“`ruby:db/migrate/create_post.rb
class Posts < ActiveRecord::Migration[5.2] def change create_table :posts do |t| t.string name t.boolean draft, comment: '下書き' end end end ``` ```ruby:post.rb // 下書きがどうかを判定するメソッド def draft? draft == 1 end ``` ## マジックナンバーは使用しない まず大前提としてマジックナンバーの使用は避けた方が良い。保守性に影響がでてしまう。 https://qiita.com/daichi0713/items/d838eda12a664bc04542#4%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%8A%E3%83%B3%E3%8
RuboCop::Cop::Rails::PresenceというRubocupの指摘
Rubocupでリファクタリングをしていたところ、モデルのメソッドで次の指摘を受けました。
“`ruby:models/sample.rb
C: [Correctable] Rails/Presence:
Use [別テーブルのidを格納した配列を弄る処理].presence || []
instead of [別テーブルのidを格納した配列を弄る処理].blank? ? [] : [別テーブルのidを格納した配列を弄る処理]
変数 = [別テーブルのidを格納した配列を弄る処理] ? [] : [別テーブルのidを格納した配列を弄る処理]
“`元の記述は配列を処理した結果、空配列であれば空配列を、そうでなければ処理した結果の配列を返すという単純なものですが、同じ記述を2回繰り返す点でDRY原則に沿った書き方ではありませんでした。
今回の指摘で簡潔に書けることがわかりましたが、これまで見かけない記述でしたのでまとめておきます。
## 短絡評価について
https://qiita.com/gyu-don/items/a0aed0f94b8b35c43290
>||の
自作言語でもRubyの map(&:foo) を真似したい!
# TL; DR
Rubyでブロックの代わりにシンボルを渡せる記法を、[Pangaea](https://github.com/Syuparn/Pangaea)でもできるようにした!
“`ruby:ruby
# どちらも同じ!
names.map {|name| name.upcase}
names.map(&:upcase)
“`“`pangaea:pangaea
# どちらも同じ!
names.map {|name| name.uc}
names.map(‘uc)
“`# はじめに
2020年から「Pangaea」というプログラミング言語を自作しています。とにかくコードを短くしたい方におすすめ(?)です。
https://github.com/Syuparn/Pangaea
言語の詳細については過去の記事をご覧ください。
– [ワンライナー向け自作言語「Pangaea」の紹介](https://qiita.com/Syuparn/items/87cafc7fd206016a0f8d)
– [自作言語のオンラインチュートリアルを作ってみた【Pangaea
画像キャッシュを部分的に無効化する
Imagemagickを深掘りするため、ユーザー画像とアイテム画像を合成させて、簡易的に試着ができるという機能を実装していた。
![9ab908fcf945ef3911f996ea2d4757e7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2584427/6c34fefb-aa1f-127b-cdc3-432f7e5790ba.jpeg)
上の画像はパンツの画像とユーザー画像を合成させているが、それぞれのアイテムページから試着ページに遷移するとそのアイテムの画像とユーザーの画像が合成されるという機能で、
例えばジャケットのページで試着ボタンを押すとジャケットの画像とユーザー画像が合成される様になっている。が、
ローカル環境では問題なく動いていたのに、AWSにアップロードした後試着ページを表示させると一番最初に合成した画像が別の試着ページに遷移しても表示されてしまい、二回目以降は試着できなくなってしまった。
[![Image from Gyazo](https://i.gyazo.com/
ransackを使った検索機能実装
この記事は勉強した内容をアウトプットし、理解を深めるための学習用記事になっています。
説明の間違えている点などありましたらご指摘いただけると幸いです。
# ransackを使った検索機能実装について## 実装手順
#### 1. gemに’ransack’を追加してインストール
“`ruby
gem ‘ransack’
“`
“`ruby
$ bundle install
“`
bundle install後にサーバーを立ち上げ直すのを忘れていて30分くらいエラーで引っかかりました、、、
bundle install後にはrails sを忘れずに!#### 2. コントローラでの記述
このときに私は事前に投稿の一覧を表示させるとずっと勘違いしていました。なので投稿一覧用の変数# @dishes = Dish.allを準備していました。
調べているとransackではデフォルトで一覧画面できるみたいです!
“`ruby
def index
# @dishes = Dish.all
@q = Dish.ransack(params[:q])
@s
[個人開発]実際に飲食店で使う予約サービスを実務未経験者が1から考え作ってみた。
# はじめに
この度、実際に飲食店で使っている予約サービスをリリースしました!
##### サービスを作ったきっかけ
私が以前、手伝いをしていた個人経営の小規模な飲食店では事前の来店数を把握したいが予約受付はは営業時間内の電話のみ。予約来店が少ないという課題を実感していました。その解決策として、お店の要望に沿った予約サービスを開発しました!実際に使えるような予約システムの参考資料がなく苦労しましたが、初心者なりに1から考え、実装してみました。
# サービス概要
一般ユーザーの予約来店を促し、管理ユーザーの業務効率化を図るサービスです。https://www.lunchcafeocean.com/
こちらは公開用のクローンサイトです。
実際に使っているものと機能は基本的には同様です。ゲストログインボタンからは管理画面にアクセスでき機能の確認が行えます。
#### 一般ユーザー
– Web予約より日付、人数、時間を指定して予約ができる。
– メニューやキャンペーン情報を確認できる。#### 管理ユーザー
**予約管理**
– Web予約に限らず、その他予約も一
Ruby を書き始めてハマったこと
## `String` なのか `Symbol` なのか
Ruby には `Symbol` という、文字列の皮を被った数値があり、少メモリで高速なことから、`Hash` のキーとかでよく見かけます。
自分で作った `Hash` であれば誤解はないですが、メソッドから生成された `Hash` のキーが `String` だったりすると、キーを指定しても `nil` が返ってきて、「俺が入れたデータが無くなっとる!」と焦ります。
### `JSON.parse` は `symbolize_names: true` をつけると `Symbol`
`JSON.parse` でそのままだと、キーは `String` になる。
“`ruby
JSON.parse(‘{“name”:”tanaka”,”age”:19}’)
=> {“name”=>”tanaka”, “age”=>19}
“``symbolize_names: true` をつけるとキーが `Symbol` になります。
“`ruby
SON.parse(‘{“name”:”tanaka”,”age”:19}
WHERE A and (B or C)をActiveRecordで記述する方法
Railsアプリケーション開発中に、`WHERE A and (B or C)`のようなSQLをActiveRecordのデータアクセスメソッドで書くときにどうすれば良いのか少しハマったのでメモとして残します。
“`sql:SQL
SELECT *
FROM model
WHERE A and (B or C) ;
“`# 結論
`merge`メソッドを使用する。
括弧に該当するメソッドが`merge`メソッドとなる。
“`ruby:ActiveRecord
Model.where(A).merge(where(B).or(where(C)))
“`# 例: ポケモン
例えば、こんな感じのポケモンテーブルがあったとする
“`ruby:db/migrate/pokemon.rb
class Pokemons < ActiveRecord::Migration[5.2] def change create_table :pokemons do |t| t.string name t.string type end en
サポートモジュールを使用したテストコードのまとめ
# アウトプット
サポートモジュールとは、RSpecに用意されている、メソッド等をまとめる機能。#### 実装の手順
① specディレクトリ配下にsupportディレクトリを作成し、その配下に`メソッド名.rb`のファイルを作成する
###### (例)spec/support/sign_in_support.rb
“`ruby
module SignInSupport
def sign_in(user)
visit new_user_session_path
fill_in ‘Email’, with: user.email
fill_in ‘Password’, with: user.password
find(‘input[name=”commit”]’).click
expect(current_path).to eq(root_path)
end
end
“`
② サポートモジュールを読み込める設定をする
Rspecを用いてRailsの機能をテストするときに、共通の設定を書いておくファイル`spec/rails_hel
Rubyで気象庁過去データからのスクレイピング
# 今回の目的
職場の農業法人で25ha全43枚の畑の管理を任されていまして、枚数と種類が多すぎて作業の管理が不可能でした。
そこで、定植日からの積算温度(1日の平均気温を積算した値)一瞬で確認できるものがあれば便利だと思い作ってみました。# なにをするのか
https://www.data.jma.go.jp/obd/stats/etrn/index.php
こちらから情報を頂いてきます。天気予報のAPI(ぽいもの)は配信されているようですが、過去の気象データはこの表かcsv形式でしか配信されておりません。
![スクリーンショット 2022-04-14 20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2512596/745abb7c-9c96-538d-d4a2-803d5b87dd28.png)この平均気温の行を取得してきて合計します。(0度以下は0として扱う)
Mechanizeを使ってスクレイピングします。# ソースコード
“`ruby:
require “Mecha
初学者:Rubyの初歩的なコードをまとめてみた。
超初歩的なRubyのコマンドを学ぶ際のアウトプット&備忘録としてまとめていく。
### greetingを使用して“Hello World”を表示
“`
greeting = “Hello Would”
puts greeting
“`
## 配列
### 配列の中を並び替えて大きい順に表示
“`
numbers = [2, 9 ,1, 5, 3, 2, 8]
puts numbers.sort.reverse
“`### 配列の中をシャッフルして表示
“`
numbers = [2, 9 ,1, 5, 3, 2, 8].shuffle
puts numbers
“`
### 配列の中の合計を表示
“`
a = [2, 9 ,1, 5, 3, 2, 8]
puts a.sum
配列の中の平均値を表示(少数)
a = [2, 9 ,1, 5, 3, 2, 8]
puts a.sum.to_f / a.size
mapを使った配列
numbers = [100, 200, 300, 400]
results = numbers.map do |num
Ruby メモ
# メモ Ruby
* 次にふれる機会のための備忘録的に。。### 規約
– キャメルケース
– クラス名、モジュール名
– スネークケース(全部小文字)
– メソッド名、変数名
– 全部大文字のスネークケース
– 定数
– `;` は1行内に複数文書く場合には文の区切りに使用できるが、めったに使わない。
– メソッド名末尾の!
– `!` はメソッド名の一部。オブジェクトの内容を変更するメソッド名には `!` を付ける
– メソッド名末尾の?
– `?` はメソッド名の一部。真偽値を戻す場合はメソッド末尾に `?` を付ける### 変数
– `_` または小文字アルファベット が先頭
– ローカル変数
– `$` が先頭
– グローバル変数
– `@@` が先頭
– クラス変数
– クラス変数はクラス定義の中で定義され、クラスの特異メソッドやインスタンスメソッドから参照・代入できる
– クラス変数の値はクラスのすべてのインスタンスで共有する
– mute
Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. Learn more at)の倒し方
Action_Mailerを使い、gmail経由でメール送信したかったが、`Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. Learn more at)`が連発してのでメモリます。
## 結論
user_name と password は環境変数におくべし。
## 実際のコード
ガイドにある通りconfig/environments/development.rb に以下を追加
“`ruby
# MailCatcher Configuration
config.action_mailer.raise_delivery_errors = trueconfig.action_mailer.perform_caching = false
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = { address: ‘smtp.gmail.com’
RSpecのテストコードの大まかな流れ
# アウトプット
各テストにおいて、必ず踏むステップは下記の通りである。
1. テストの前に`before`を使用してFactoryBotの生成
2.
[モデル単体テスト]
example毎にインスタンスの値を変更[コントローラー単体テスト]
`get`でリクエストを送りたいパスを指定[結合テスト]
`visit`で移動したいページに遷移3. expectation構文で挙動の確認
4. bundle exec rspecコマンドでテストコードの実行
# 学んだこと
RSpecのテストコードは、種類によって記述も変わるが、
大まかな流れや共通点を見つけると、「次に何を記述すべきか」が掴みやすくなった。
【LeetCode】110. Balanced Binary Treeを解いてみた
## はじめに
コーディングテスト対策としてLeetCodeの110. Balanced Binary Treeを解いていく。## 問題文を和訳
– 二分木が与えられた場合、それが高さのバランスが取れているかどうかを判断します。
– この問題では、高さのバランスが取れた二分木は次のように定義されます。
– すべてのノードの左右のサブツリーの高さが1以下しか異なる二分木。
– Input: root = [3,9,20,null,null,15,7]
– Output: true## 回答
“`110_BalancedBinaryTree.rb
def is_balanced(root)
return depth(root) >= 0
enddef depth(root)
if root == nil
return 0
end
left = depth(root.left)
right = depth(root.right)
if (left – right).abs > 1 || left < 0 || right < 0 retu
Mailerでmissing templateになってしまった
![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525610/951586bb-b754-8987-fa59-ba2c02f6e599.png)
https://qiita.com/ki_87/items/67f8965e8de17e95ac1c
コチラのサイトを参考にさせていただきメールの送信機能を実装しました。
ですが、上記のエラーが出てしまいました。なぜ。。。。###### こいつは馬鹿です
いや誤字はない。どこが。。。おかしいんだ。。。
###### こいつは馬鹿です
何で!なんで!お父さん帰ってこないんだよ!!
###### ※関係ありません
答えは簡単。
彼は見落としていました。~~~view/contact_mailer/send_mail.text.erb
===============================
<%= @mail_title %>
===============================
SSLクライアント証明書を使ってRubyのFaradayで通信する方法
詰まったのでメモします
# 前提
– Ruby: 2.7
– Faraday: 2.2.0# コード
“`ruby
# urlは通信先のURL
url = ‘https://example.com’
connection = Faraday.new(url: url) do |faraday|
faraday.request :url_encoded
faraday.adapter :net_http
# ファイル名は各自のファイル名
faraday.ssl.client_cert = OpenSSL::X509::Certificate.new(File.read(‘ssl_client.crt’))
builder.ssl.client_key = OpenSSL::PKey::RSA.new(File.read(‘ssl_client.key’))
endconnection.get(url) do |req|
req.headers[‘Content-type’] = ‘application/json’
end
【Docker】駆け出しエンジニアがDocker公式チュートリアルに躓きまくった件
可能な限りDocker公式が提供しているチュートリアルに沿って、Ruby on rails + MySQLの環境構築を行います。
## はじめに
こんにちわ、2022年4月よりエンジニアとして働き始めたばかりのUdai(ゆうだい)です!今回は、Docker公式チュートリアルを行った際に大量のWorningやErrorに苦しんだので、これからチュートリアルに訪れる初学者の同士が同様に躓かないようにと思い筆を取りました。
如何せん、私はまだまだ駆け出しのエンジニアですので、本記事はDockerを知らない人や名前だけは知っているよといった初学者向けの記事となっております。そのため、粒度はかなり細かいものとなっております。
また、それでも一読してくださる寛大なシニアなエンジニアの先輩方は記事の内容に誤りがございましたら、遠慮なく指摘・訂正していただけると幸いです。
※ 注意点
– チュートリアルとデータベースが異なります。(PostgreSQLからMySQLへ変更)
– 手早く同上の環境構築を行いたい方は他の素晴らしい記事を参照してください。## 対象
– 実際にDockerを
Ruby 無限ループで each_with_index のようなカウント数を得る
# コード例
“`rb
(1..Float::INFINITY).each { |i| p i }
“`# 実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/7d8aec45-3622-31d1-7825-34e98926fba3.png)
Rubyでじゃんけんを作る プログラングの練習
# 何?
– 人数を指定してじゃんけんをする
– 勝敗がつくまでじゃんけんを続けて、勝敗がついたら試行回数を数える# コード
“`ruby
variations = [“G”,”C”,”P”]
MEMBER = ENV[“MEMBER”]&.to_i || 3
puts “JANKEN!”
puts “#{MEMBER} members”try_count = 0
(1..).each do |i|
try_count = i
cards = []MEMBER.times do
cards.push variations.sample
endputs cards.join(” “)
# 勝敗が決まった場合
# じゃんけんで勝敗が決まるのは、手の種類が2個の場合である
if cards.uniq.count == 2
break
end
endputs “#{try_count} tried”
“`# 実行例
![image.png](https://qiita-image-store.s3