- 1. 【Rails】Sorceryで外部認証 〜Google編〜
- 2. 【Rails】【SQL】子モデルの最新レコードを基準に親モデルをソートする方法
- 3. rails7でomniauthで認証しようとしたらエラーばっかりでうまくいかなかった
- 4. Rubyで平衡二分探索木を実装(AA木)
- 5. An error occurred when sending a notification using ‘slack’ notifier.OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed (unable to get local issuer certificate) 的なエラーの解決方法
- 6. 【Rails】dotenv-railsの導入
- 7. rails sができない(Address already in use – bind(2) for “127.0.0.1” port 3000 )
- 8. Rails next if と break ifって何ですか?
- 9. [Ruby] include, prepend, extend の違い
- 10. Rails Youtubeの動画投稿・編集
- 11. 【Ransack】セレクトボックスでソート機能
- 12. will_save_change_to_attribute?(attr_name)でプチ・リファクタリングした例
- 13. メソッド、インスタンスメソッド、クラスメソッドの違い
- 14. 100日後くらいに個人開発するぞ!day052
- 15. 【Ruby】バリデーションのかけ方 Part1
- 16. クラス変数を使ったインスタンスカウンターの書き方(自分用)
- 17. [ポリモーフィズムとは?]具体例で考える
- 18. Rubyで宣言的なプログラムを書くためのテクニックTips
- 19. eachの危険性を体で覚えて、その代替手段を知る(Ruby, Rails)
- 20. Ruby で手続きを別プロセスに渡したい
【Rails】Sorceryで外部認証 〜Google編〜
# はじめに??
現在個人開発しているサービスにて
SorceryのExternalモジュールを利用して外部認証を実装する際に
google認証を実装している例がなかったため、備忘録も兼ねて記します。### 環境?
– Ruby `3.0.1`
– Ruby on Rails `6.1.4.4`
– 【gem】 sorcery `0.16.2`### 想定読者?
– sorceryのexternalモジュールをベースとしてgoogle認証を実装したい人### 前提?
– [Simple Password Authentication](https://github.com/Sorcery/sorcery/wiki/Simple-Password-Authentication)でのメールアドレス認証機能は実装済みであること。# 実装の流れ✔️
少し長い道のりなので全体像を把握しておきましょう。
1. authenticationsテーブルを作成
2. Authenticationモデルの設定
3. OauthsControllerの作成
4. ルーティングの追加
5. G
【Rails】【SQL】子モデルの最新レコードを基準に親モデルをソートする方法
大阪でRailsを中心に学習している薬剤師エンジニア(初学者)こと、ヨマ([@yoma_2003](https://twitter.com/yoma_2003))です!
Railsで`子モデルの最新レコード`を基準に`親モデルをソート`する方法をまとめます。※おことわり※
断定口調でまとめますが、初学者であるため間違い等あればご指摘頂けると嬉しいです。# はじめに
Railsで次のような親子関連を持ったモデルがあったとします。“`character.rb
class Character < Application Record has_many :topics end ``` ```topic.rb class Topic < ApplicationRecord belongs_to :character end ``` ### charactersテーブル | id | name | describe | |:--:|:----:|:----------:| | 1 | 田中 | 初学者 | | 2 | 鈴木 | Rails学習中 | |
rails7でomniauthで認証しようとしたらエラーばっかりでうまくいかなかった
# 最終的にはちゃんとできました。
他の言語にうつつを抜かしている間にRubyは3出てるし、railsは7系出てるしでまさに青天の霹靂。
ホスティングする環境によって最近使ってるdotnetをあまり使いたくなかったので、久々にrails触った。# やりたいこと
ユーザー認証まわりはCognitoにおまかせして、さっと作りたかった。## 参考にさせていただきました
こちら
https://qiita.com/yhirano55/items/272125c3ce3d7873002e
ありがとうございます。## ですが動かない
### 最初は「OmniAuth::AuthenticityError Forbidden」が出る
![スクリーンショット 2022-07-07 22.02.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120789/7ca80e2f-48e9-6e64-c133-6871387d0779.png)
これですね。
これは
`gem ‘omniauth-rails_c
Rubyで平衡二分探索木を実装(AA木)
競プロで必要になったときのため & アルゴリズムの勉強のため。
平衡二分探索木(self-balancing binary search tree)を調べたらいくつか出てきたが、基礎的な考え方をしていて且つ場合分けが少ない(と感じた)**AA木**を選ぶことにした。[Wikipediaの記事](https://ja.wikipedia.org/wiki/AA木)にあった説明にほぼ沿って実装した。
※ ちなみに勉強前は、ふつうの二分探索木すらきちんと知らなかった。
## 実装
* 既に存在している値を挿入した際は、別のノードを作って記憶するようにした。
* コード末尾には簡単なテスト(デバッグおよび性能測定)を付けた。“`ruby:aa_tree.rb
class AATree
class Node
attr_accessor :left, :right, :value, :leveldef initialize(value)
@value = value
@level = 1
enddef inspect
[@left, @va
An error occurred when sending a notification using ‘slack’ notifier.OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed (unable to get local issuer certificate) 的なエラーの解決方法
# エラー内容
本番サーバーで以下のことを行ったら表題のエラーが出ました。
* Slackにエラー通知を実装(gem ‘exception_notification’)
* Cloudinaryに画像をアップロード“`
An error occurred when sending a notification using ‘slack’ notifier.OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed (unable to get local issuer certificate)
“`# 解決方法
本番サーバーにログインし、以下実行。
“`
curl -fsSL curl.haxx.se/ca/cacert.pem -o “$(ruby -ropenssl -e ‘puts OpenSSL::X509::DEFAULT_CERT_FILE’)”
“`
解決しない場合はnginxやサーバーの再起動を行ってみてください。###
【Rails】dotenv-railsの導入
# はじめに
* 学習の覚え書として書いています
* 自己解釈ですので参考程度にご覧ください# dotenv-rails とは
* 環境変数を管理できるgem
* 環境変数 → **公開したくない情報(値)**
(メールアドレスやパスワードなど)つまりGitなどにアップする際、公開したくない情報(値)をdotenv-railsで管理することができます。
# dotenv-rails 使用手順
①dotenv-railsの導入
②環境変数を記述するファイルを作成(.env)
③環境変数の記述
④ソースコード内で環境変数を使用
⑤GitHubの公開設定(.gitignoreに.envを追加)## ①dotenv-railsの導入
* gemfileに追記(一番下の行に **gem ‘dotenv-rails’** を追記)
* ターミナルで **$ bundle install** を実行## ②環境変数を記述するファイル **.envファイル**を作成
* ターミナルで **$ touch .env** を実行
(.envは既定のファイル名なので誤字が無いように作成)
rails sができない(Address already in use – bind(2) for “127.0.0.1” port 3000 )
いつも通りrails sをしたら上記のエラーが出たので解決方法を載せておきます
現在動いてるRubyのプロセスを確認
“`
$ ps -ax | grep ruby
“`このように表示される
“`
49551 ?? 0:00.00 /Users/UserName/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/rb-fsevent-0.11.1/bin/fsevent_watch –format=otnetstring –latency 0.1 /Users/UserName/Rails_product/you_conect/config/locales
49552 ?? 0:00.00 /Users/UserName/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/rb-fsevent-0.11.1/bin/fsevent_watch –format=otnetstring –latency 0.1
“`
動いてるプロセスを終了する
“`
例: kill 49551
$
Rails next if と break ifって何ですか?
#### はじめに
自社製品のコードを見ていたら変なif文を見つけてしまいました。それは
– next if
– break ifというif文でした。条件のあるif文なのだろうくらいにしか捉えておらず、理解しました的な感じでしたり顔してましたら先輩から「この文の意味わかるよね」と言われたので取り繕っていたら詰められて白目になりましたので備忘録として残したいと思います。おかしな部分があれば教えていただければ幸いです。
#### 環境(今回検証した自分のPC)
Ruby 2.6.5
Rails 6.0.5#### 前提
データを準備します。
booksテーブルを作り値を準備します。
– seeds.rbに次のように記述し、rails db:seedでDBにデータを登録します。
~~~ seeds.rb
Book.create!(
[
{
title: ‘hunter*hunter’,
price: 700
},
{
title: ‘SLAM DANK’,
price: 600
},
[Ruby] include, prepend, extend の違い
個人的に忘れがちなものなので、自分用でメモしておきます。
間違いがありましたら、ぜひご指摘お願いします!
# 用途による分け方
|用途|キーワード|個人的な
使用頻度|
|-|-|-|
| あるモジュールのインスタンスメソッドが欲しい
かつ、**今のクラスやモジュールの定義を優先したい** | [Module#include](https://docs.ruby-lang.org/ja/latest/method/Module/i/include.html) |高|
| あるモジュールのインスタンスメソッドが欲しい
かつ、**今のクラスやモジュールのインスタンスメソッド定義より優先したい** | [Module#prepend](https://docs.ruby-lang.org/ja/latest/method/Module/i/prepend.html) |底|
| あるモジュールのインスタンスメソッドが欲しい
かつ、**特異メソッドとして欲しい** | [Object#extend](https://docs.ruby-lang.org/ja/lat
Rails Youtubeの動画投稿・編集
# 概要
Youtubeにアップロードされた動画をRailsアプリで投稿したいという方に向けたものです。
Youtubeの動画を投稿した時にYoutubeのURLのなかで最後の11桁の値のみを取り出し、他の変数に取り入れるようにしている記事が多い。
それだと編集する時に、末尾11桁を入力しないとエラーが起こってしまうので、それが起きないような、その実装方法を記載します。# 事前準備
実装にあたって、私の開発環境を載せておきます。
“`rb:環境
ruby 3.0.4
Rails 6.1.6
“`以下のコマンドを入力して、アプリケーションを作成していきます。
“`rb:ターミナル
cd desktop
rails new youtube_sample
cd youtube_sample
“`# YouTubeURLの種類
## 1. パソコンでのYouTube閲覧時のURL
![Sc
【Ransack】セレクトボックスでソート機能
# はじめに??
Ransackを使い検索機能を実装している個人開発サービスにて
下記画像のようなソート機能を実装する際に少し面倒だったので、備忘録も兼ねて記します。### 環境?
– Ruby `3.0.1`
– Ruby on Rails `6.1.4.4`
– 【gem】 [Ransack](https://github.com/activerecord-hackery/ransack)### 想定読者?
– ransackでのソートをデフォルト表示からセレクトボックスでの選択に変えたい人# ①セレクトボックスの選択肢にリンクを貼る?
まず、ただのセレクトボックスだと選択したところでリンク先に飛ばないので、
`“`
will_save_change_to_attribute?(attr_name)でプチ・リファクタリングした例
# やりたいこと
userテーブルのemailが変更されるかどうかを判定したい、みたいなこと、あると思います。# 実装!
これでもいけますが、、
“`ruby
!new_record? && email == email_in_database
“`この方がスマートですよね、と。
“`ruby
will_save_change_to_attribute?(:email)
“`何が嬉しいかというと、コードがシンプルになったのと、`&&`が無くなったのでRubocop様も喜んでくれました(Metrics/PerceivedComplexity)。
# 参考
new_record
https://railsdoc.com/page/model_new_record_qattribute_in_database(attr_name)
https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Dirty.html#method-i-attribute_in_databasewill_s
メソッド、インスタンスメソッド、クラスメソッドの違い
# 初めに
プログラミングの勉強を始めて3ヶ月ほど経ちますがよく似た言葉や似たニュアンスの多い言葉がよく登場するケースによく遭遇します。例えばjavascriptで言うと関数とメソッドなど。このようなケースに遭遇した際正確な違いを特定するために2〜3時間かかる時もあります。なので初学者の方に私が今回調査した内容を共有することで「無駄な時間」を少しでも減らし、皆さんの学習の手助けに少しでもなれたらと思いこの記事を作成しています。# 目次
1,メソッド、インスタンスメソッド、クラスメソッドとは??
2,3つの違いまとめ# 1.メソッドとは?
パソコンに元々あるショートカットみたいなもの。
ショートカットとは?⇨1つのボタンでたくさんの処理をしてくれる機能
例えば、『おはよう』という文章を作りこの文章を削除しようとした際
パソコンのデリートキーを「4回」連続で押す必要がある。
ただショートカットだとcommand + D を1回押せば1文全て一瞬で削除できる。“`.rb
def season # ⇦メソッドを作成。その中に下の季
100日後くらいに個人開発するぞ!day052
## 今日はインスタンスメソッドを学んでみた!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/1927ee16-998b-e958-856c-3062b5e1877a.png)
## 今日の学び
### クラスの中で定義したメソッドの使い方
* クラスの中でメソッドを定義でき、「インスタンス.メソッド名」で呼び出せる
* 例
* `class Menu`
* ` attr_accessor :name`
* ` attr_accessor :price`
* ` def show`
* ` puts “私はメニューです”`
* ` end`
* `end`
* `menu1 = Menu.new`
* `puts menu1.show`
* インスタンスメソッドも引数を受け取ったり戻り値を返すことができる
【Ruby】バリデーションのかけ方 Part1
## バリデーションの基本的な掛け方
### バリデーションとは?
入力されたデータ、プログラミング言語やマークアップ言語の記述が、適切に記述されているかどうかを検証することである。
多くの場合は、プログラミング言語においてフォームなどに入力された文字列が入力規則に対して妥当に記述されているかどうかを検証する仕組みを指す。記述が妥当でない場合はエラーとして値を返すように設定される。### 基本的なバリデーションの掛け方
“`
validates :カラム名, ヘルパー
“`
Railsにはバリデーションのヘルパーが多数用意されている。
このヘルパーを使うとどういう検証を行うかを定義することができる。
主なヘルパーを紹介していきますね。### バリデーションのヘルパー
#### presence
一番多く使うヘルパー。
定義すると「空でないか」を検証してくれ、空でない場合はエラーで弾かれる。
多くの場合は必須で入力するじゃないかな?
“`
validates :カラム名, presence: true
“`
入力するカラム名が空でないかを検証する。
例えば以下のように入力
クラス変数を使ったインスタンスカウンターの書き方(自分用)
https://www.javadrive.jp/ruby/class/index8.html
[ポリモーフィズムとは?]具体例で考える
## こんな人に読んでほしい
– ポリモーフィズムって言葉は聞いたことがある
– ググってもイマイチわからない
– 具体例を出して説明してほしい## 具体例
ここはブック○フ。最近は、本も洋服もゲームも売っている。こことコンビニさえあれば、一生生きていけるなぁ、
そんなことを思っていた矢先、在庫を管理するシステムの設計を任された。先輩 「まず、在庫の情報を出力するコードをかいてね☆」
さぁ、こんなときどんなコードを書きますか??
## ポリモーフィズムを一言でいうと
ポリモーフィズム(多態性)の文字通り、同じメソッド名なのに、
クラスによって実行結果が変わる## 今回の例でいうと
Itemを継承しているBook、GameSoft、Clotheにおいて定義したprintメソッドがあり、それを呼び出すと、それぞれの子クラスに合わせて違う結果を返してくれる## 情報の整理
– 在庫(stock)にある商品(item)には全て、title, price, categoryがある
– 商品の種類は3種類
– 本(book): 著者(author)の情報がある
Rubyで宣言的なプログラムを書くためのテクニックTips
## この記事は何
この記事は、宣言的なプログラムを書くために使える、ちょっとしたテクニックを紹介していきたいと思います。宣言的なプログラミングが何かは以下の記事が参考になると思います。
https://qiita.com/jun1s/items/5f60bbb886626d897abc
## テクニック集
### テクニック1: 変数は使い回さない
Rubyの場合、定数が少しピーキーな挙動になっているので、基本的に全ての変数は可変になってしまうと思います。
変数を使いまわしたり、値を変更するのはできるだけ避けることで、コードが追いやすくなり、冪等性の担保されたコードがかけるようになります。“`rb:bad
a = 1
a += 1
“`“`rb:good
a = 1
b = a + 1
“`### テクニック2: 破壊的メソッドは用いない
破壊的メソッドは、自身の状態を変更させるメソッドです。これらのメソッドを用いると、テクニック1で述べた内容と同じく、コードが追いづらくなります。値の変更はできるだけ非破壊的なメソッドと変数代入を用いるようにしましょ
eachの危険性を体で覚えて、その代替手段を知る(Ruby, Rails)
# やっちまった
話を単純化してお伝えすると、1万件以上レコードがあるusersテーブルに対して、`is_active`というカラムがあって、全員trueにしたかったです。これを実現するのに、**全usersに`each`をかけて`update_column`する処理を仕掛けたら、本番のサーバーを一瞬死なせてしまい、めちゃめちゃ焦りました**。
“`ruby
User.all.each do |user|
user.update_column(:is_active, true)
end
“``User.all.each`すると、該当するレコードを全て取得してきて、メモリに置いて処理をするので、それで激烈に重くなってしまうようです。この場合、Userのインスタンスを1万件以上取得して配列にしてそれをメモリにドーン!と置いて処理しようとしたので、それがメモリを強烈に圧迫してしまったみたい。
# 解決策1:`find_each`を使う
この時の対処方法の1つが`find_each`を使うこと。これはレコードを持ってくる数に制限をかけながら処理を実行するので、メモリへの
Ruby で手続きを別プロセスに渡したい
# はじめに
Ruby の並列実行では,[parallel](https://github.com/grosser/parallel) を使うのが簡便である.“`ruby
require ‘parallel’results = Parallel.map([‘a’,’b’,’c’], in_processes: 3) do |one_letter|
SomeClass.expensive_calculation(one_letter)
end
“`他方,`in_processes` では,メインプロセスをフォークして実行するので,メインプロセスのメモリ使用量が多く,分割プロセス数が膨大な場合,メモリが枯渇して `Parallel::DeadWorker` や「Killed」が発生してしまう.これを回避するには,子プロセスを,`Kernel.#system` などによる別コマンドとして実行すると良い[^1].入出力が必要な場合は,`IO.popen` などを使うとよいだろうか.
[^1]: [Ractor](https://techlife.cookpad.com/e