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

Ruby関連のことを調べてみた2022年05月09日
目次

【Python】配列の順序を保持しながら集合演算(和集合、差集合、積集合)を行いたい

# はじめに 私ごとですが、最近RubyのプログラムをPythonに書き換える機会がありました。 その時、配列に対して集合演算する必要があり、Pythonでこの方法を調べるとlistを一度setに変換して集合演算を行い、再度listに変換し直す記事が多数でした。 setは便利ですし、大半の場合はこの方法で十分だと思いますが、わたしの場合はもとのlistの順序を保持したかったので、setを使うことはできませんでした。 よって本記事には、Pythonでsetを使わずに配列の順序を保持しながら集合演算を行う方法を残したいと思います。 # 目指す動作(Rubyの集合演算) ## 和集合「|」 “`ruby [2, 1, 1, 7, 5, 5] | [3, 3, 5, 7, 9] # => [2, 1, 7, 5, 3, 9] “` 重複している要素は取り除かれます。 左辺を基準に順番が保持されています。 ## 差集合「-」 “`ruby [2, 1, 1, 7, 5, 5] – [3, 3, 5, 7, 9] # => [2, 1,
元記事を表示

自社サービス「病院なび」へ AWS Opensearch を導入したい

はじめまして。「[病院なび](https://byoinnavi.jp/)」の開発チームメンバー甘利です。 国内最大級の病院検索サービス「病院なび」の改善にRailsエンジニアとして日々挑み続けております。現在 AWS Opensearch の導入を業務いて行なっています。少しずつ共有して行けたらと思っています。(※ この記事に具体的な手順等は含まれていません) # 概要  自社サービスの 「病院なび」 に AWS Opensearch を導入するにあたり ”使いやすい仕組み” を目指して色々考えていきたいと思っています。「病院なび」 は主に Ruby on Railsで開発されていますので、便利な Gem で楽な実装ができると考えていました。ところが、AWS Elasticsearch から AWS Opensearch に変更になってしまい、巷にあるGemがそのまま使えなくなってしまい、楽ができなくなってしまいました orz。  現状、Opensearch を Rails から利用する際の選択肢として”公式コミュニティが公開している Ruby 用クライアントの利用”が比較的楽で
元記事を表示

Ruby メソッドについて

今回はメソッドについて学んでいきます。 Rubyでいうメソッドとは一体なんなのでしょうか? 前回、オブジェクト、クラス、インスタンスについて学習しました。 ざっくりと復習していきましょう。 Rubyの世界では全てがオブジェクトであり、オブジェクトとは「もの」のことです。 言葉で表現できるものは全て「もの」になります。 例えば、猫、人間、時間などなど、、 またクラスとインスタンスは何かというと、 例えば、僕たちは人間クラスに属しており、人間クラスのインスタンスオブジェクトです。 ハンバーグは食べ物クラスに属しており、食べ物クラスのインスタンスオブジェクトです。 Rubyの世界で言うのならば、 “あああ”はStringクラスに属しおり、Stringクラスのインスタンスオブジェクトです。 123 はIntegerクラスに属しおり、Integerクラスのインスタンスオブジェクトです。 では今回のメソッドとは一体なんなのでしょうか? メソッドとはオブジェクトがなんらかの仕事や振る舞いをすることです。 例えば、「人間の僕はqiitaの記事を書く能力を持っている。」 と言うのはこの「q
元記事を表示

ネスト、collectionとmemberの違いについて(ルーテイング設定)

ルーテイング設定のネスト、collectionとmemberの違いについて学んでいきましょう。 “` resources :stores do resources :products member do get ‘drink’ end collection do get ‘ice’ end end “` まずはネストから学んでいきましょう。 記載方法としては上の1~2行目です。 このようにresourcesの中にresourcesを記載することで 親子関係を作ることができます。 routingがこのようになります。 “` #ネストしたルーテイング /stores/:store_id/products/:id “` storeの中にproductが入り込んでいるイメージです。 次は一気にmemberとcollectionを見ていきましょう。 一番最初のコードの2行目以外にご注目ください。 このmemberとcollectionを使うと下のようにルーテイングが変化します。 ルーテイングが変わることによって、基本のアクション以外のルーテイングを
元記事を表示

絶対はずさないお店を検索できるwebアプリケーションをリリースするまで③

javascript 文字列を数値に変換するメソッド ~~~ parseFloat メソッド名 javascript 文字列を数値に変換するメソッドになる。 ~~~ ~~~ グーグルマップ表示 let timer = setInterval(() => { if (window.mapLoaded) { clearInterval(timer); console.log(parseFloat(this.cooks[0].lat)) const map = new window.google.maps.Map(this.$refs.map, {                 center: { lat: parseFloat( this.cooks[0].lat),                 lng: parseFloat(this.cooks[0].lng) }, ~~~ ~~~ parseFloatの使い方(緯度経度) center: { lat: parseFloat( this.cooks[0]
元記事を表示

RSpecでCapybaraを導入する

# 概要 RSpecにCapybaraを導入したらつまづいたので解決方法を共有します 1人でも多くの人の役にたてればと思います。 # はじめに ### 使用する環境 – MacOS(M1) – Rails 6.1.5 – Ruby 3.1.0 – yarn 1.22.17 – Homebrew 3.4.8 ## 状況 ログインのテストを作成しようとしたときに、 visit root_pathを記述してページ移動をしようとした時に、テストを実行しようとしたらエラーが出てしまって詰まった ### 1つ目のエラー ![スクリーンショット 2022-05-08 16.27.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124434/6324eaee-a695-3864-fd88-19c2198b5452.png) ### 考察 文法的には間違えてない為デバックをしたところ、visitがそもそも定義されてないことを発見した。 調べてみるとvisitはCapybaraに定義されてる為うまく読み
元記事を表示

Ruby オブジェクト指向

Ruby Ruby on Rails の世界ではオブジェクトで溢れています。 では、オブジェクトとは一体なんなのでしょうか? 辞書で調べるといろいろな意味が出てきますが、 簡単にいうと「もの」のことです。 私たちの身の回りにもいろいろなものが溢れています。 例えば、椅子 水筒 ベッドなどなど、 それぞれの「もの」が仕事をしてくれて私たちの生活を豊かにしてくれています。 Rubyの世界も同じで、たくさんの「オブジェクト」で溢れています。 「オブジェクトを自ら作り、使うことで、コンピューターにしてもらいたい仕事をしてもらう」これがRubyです。 それぞれのオブジェクトは自分のクラスを持っています。 例えば 昨日の記事の例で言うのならば 「佐藤先生 ・・・ 先生クラスに属している」 このようなイメージです。 では実際にコードを書いてクラスを調べていきましょう。 “` “あああ”.class => String /文字列 2.class => Integer /整数 “` “あああ”はString(文字列)クラスに属しています。 2はInteger(整数)クラスに属しています。
元記事を表示

rails ネスト機能について

今回はrailsのルーテイングの時に役に立つnestについてまとめて見ました。 ネストを使うとルーテイングの見やすさが一気に上がるので、ぜひこの記事を参考にして見てください。 早速ですが、ネストを理解する前に、掲示板とコメントの関係を思い出してください。 … 掲示板とコメントの関係ですが、これは、必ずと言っていいほど、掲示板の中にコメントが書かれていますよね。 このQiitaも全く同じ機能で、掲示板を僕が一つ記事を書き、そこに読者様からのコメントがありますよね。 こういう風に一対多(掲示板が1、コメントが多)の関係になっているものはネストでルーテイングを表現してあげましょう。 そちらの方が視覚的にも見やすいです。 具体的には以下をご覧ください。 Boardモデル “` class Board < ApplicationRecord has_many :comments end ``` Commentモデル ``` class Comment < ApplicationRecord belongs_to :board end ``` ネストの表現方法は下のよう
元記事を表示

[railsチュートリアルで理解必須]railsアプリケーションの仕組み

# はじめに 今回はrailsの仕組みやどのように動いているかをアウトプットしていきます! もし誤りがございましたらコメントでご指摘ください! # 前提 Usersリソースをscaffoldで生成している。 # Model-View-Controller (MVC) **railsアプリケーションの仕組みを理解する上でとても重要なのがMVCモデルです** **この理解を曖昧にして勉強を続けているといつか必ず詰みます(実体験)** MVCモデルとは、ソフトウェアをModel・View・Controllerの3要素に分割し、プログラムを整理しやすくする考え方です。 railsはこのMVCというアーキテクチャパターンを採用している。 > Railsアプリと通信する際、ブラウザは一般的にWebサーバーにリクエスト (request) を送信し、これはリクエストを処理する役割を担っているRailsのコントローラ (controller) に渡されます。コントローラは、場合によってはすぐにビュー (view) を生成してHTMLをブラウザに送り返します。動的なサイトでは、一般にコントローラは
元記事を表示

Ruby on Railsのrefileでwrong number of arguments (given 3, expected 2; required keyword: object)が発生したときの対処

Rails初心者大学生です。
こちらを元に、編集画面にrefileで画像アップロードをしようとした所、上記のエラーが吐かれたので奮闘しました。 再び同様の事態が起きても対処できるようにメモ。 ## 環境 Ruby: 3.1.2 Rails: 7.0.2.4 ## 原因 https://teratail.com/questions/313718 上記の回答によると、どうやらrefile自体が長らく保守されていないため、現在のバージョンに対応していないらしいです。 ## 試したこと バージョンダウンを試みました。rbenvを利用してインストールし、Gemfileの内容を変更。 Ruby: 2.7.6 Rails: 6.1.3.2 こちらで、「bundle install」を実行すると、 “` Bundler could not find compatible versions for gem “activesupport”: In snapshot (Gemfile.lock):
元記事を表示

Gem のクラス継承・モジュール利用を可視化する Gem を作った

# 概要 正確には、可視化しようと頑張る(正確に可視化できるわけではない) Gem https://github.com/tommy-012/ancestors_visualization 使い方は、↑ に書いてあるので、気になった人はどうぞ # きっかけ 別件で、Twitter Gem を見ていて、GitHub ページに[クラス継承の ER 図](https://github.com/sferik/twitter#object-graph)があって、全体感を把握する上でいいいなと クラス継承だけでなくモジュール利用も可視化できたらなと思い、ancestors 等を使って検討していたらそれっぽいものが出来たので 汎用的に使えるよう Gem にしてみた # 事例 イメージ湧かない人もいると思うので、既存 Gem([Twitter](https://github.com/sferik/twitter))に対して、実行してみた結果を載せる ![twitter_ancestors_20220505113344.png](https://qiita-image-store.s3.
元記事を表示

【解決策】<%= image_tag モデル名.image %>でビューに表示されない / Rails / アクティブストレージ使用 / アソシエーション済

今回は以下のエラーに出会った際の解決策をご紹介します。

Ruby on Rails

<%= image_tag item.i

元記事を表示

Ubuntu 22.04にJupyter NotebookとIRubyをインストール(pyenv, rbenv, Bundler を使用)

– それぞれのバージョンが上がった以外は[前回の Ubuntu 18.04 のとき](https://memo88.hatenablog.com/entry/2020/06/07/112841)からあまり変わっていません – 手軽に試したい場合は公式の Docker イメージを使うのが良いと思います([IRuby の README](https://github.com/SciRuby/iruby/blob/master/README.md) を参照) # バージョンなど “` Ubuntu 18.04(コンテナ外の作業環境) anyenv pyenv Python 3.10.3 rbenv Ruby 3.1.2 jupyter 1.0.0 jupyter_core 4.10.0 notebook 6.4.11 iruby 0.7.4 “` # Docker の用意
元記事を表示

rspecで該当部分のSQLのログをコンソールに出力する

# 背景 実際にどんなSQL出てるのか見たい。 ローカルで単発想定。 belongs_toのvalidationでSQL呼ばれてるとかに気付くことができる。 # 出力方法 “`.rb # before # subject { described_class.start!(user_id: user.id) } # after subject do user_id = user.id using_sql_logger do described_class.start!(user_id:) end end “` こう書き換えるとSQLが出力されるようにした。 # 準備 “`spec/support/sql_logger.rb # frozen_string_literal: true module SqlLogger def using_sql_logger cached_logger = ActiveRecord::Base.logger ActiveRe
元記事を表示

rails twitterみたいに投稿してからの時間を表示 完全版

rails でTwitterのように投稿時間を「何分前」と表示したい場合 ステップ1  posts controoller のcreateアクションでPost .newにcreated_at:        params[:created_at])を追加する ステップ2  index.htmlで投稿一覧をつくる。(これは自分の作りたいものによって変わる) ステップ3  表示したいview(私の場合index.html)で<%= time_ago_in_words(post.created_at) %>前 を書く。 ステップ4  about 1 hour 前 や  1day 前         などが表示されるようになる。 ステップ5  config.time_zone = “Asia/Tokyo”         config.i18n.default_locale = :ja   をconfig/application.rbで入力する ステップ6  config/locales/en.yml で  ja: datetime: distance_in
元記事を表示

jQueryインストール

こんにちは 未経験から転職を目指すものです 今回はrailsアプリに jQueryを入れて 画面に動きをつけていこうと 思います。 ## 環境 * macOS Monterey 12.3.1 * Ruby 3.1.2 * Bundler 2.3.10 * Rails 6.1.4.7 # jQueryインストール まずはjQueryをインストールしていきます。 rails5以前はjquery-railsというGemをインストールするのが 主流のようですが webpacker管理するには yarnコマンドを使用しないといけないので、 yarnを使用してjQueryをインストールしていきます。 “` $yarn add jquery yarn add v1.22.18 [1/4] 🔍 Resolving packages… [2/4] 🚚 Fetching packages… [3/4] 🔗 Linking dependencies… [4/4] 🔨 Building fresh packages… success S
元記事を表示

Railsのdeviseでパスワードリセット時にメールアドレス以外の値もチェック項目として使用する

# はじめに こんにちは。 Rails書き始めて4ヶ月になりました。 今回はdeviseを使用したユーザ認証基盤において、パスワードリセット時にメールアドレス以外の値もチェック項目として追加してみました。 参考になれば幸いです:bow: # 結論 以下では、emailとusernameの2つの値でチェックしています。 “`ruby:user.rb class User < ApplicationRecord devise reset_password_keys: %i[email username] end ``` あとは、formでusernameもPOSTされるようにすればOKです:ok_hand: # 解説 パスワードリセット時のkeyは以下で`email`がデフォルトで設定されています。 https://github.com/heartcombo/devise/blob/main/test/rails_app/config/initializers/devise.rb#L135 こちらを上書きすることでkeyを増やすことができます。 上書きはconfig
元記事を表示

非同期時の送信ボタン制御について

# 記事の内容 非同期での送信ボタン制御を実装する中で色々と躓いたため、備忘録も兼ねて記録として投稿しました。 今回は、XMLHttpRequesを使用して JavaScript から非同期的にデータを送信する方法をご紹介いたします。 # 完成形 [![Image from Gyazo](https://i.gyazo.com/0b3d2fa3696586e4a03339fcda9dc771.gif)](https://gyazo.com/0b3d2fa3696586e4a03339fcda9dc771) # 完成形のコード modelオプションに設定している`@pdf`は、コントローラで定義しているインスタンス変数になります。 `gem`は`wicked_pdf`を使用しており、ここではPDFファイルを生成する処理を記述しております。 https://qiita.com/inoue9951/items/4498e5d130702d884352 ※ コントローラ、フォーム部分は一部割愛しております。 “`ruby:order_page.html.erb <%= form
元記事を表示

Ruby で Translation API を叩く

# ゴール 以下を ruby から叩く。 https://cloud.google.com/translate [500,000 文字 / 1 ヶ月までは無料](https://cloud.google.com/translate/pricing)なので、とりあえず Translation API Basic # 事前準備 具体的には、[こちら](https://cloud.google.com/translate/docs/setup) – GCPのプロジェクト(課金の有効化)を作って – 翻訳APIを有効にして – 認証JSONファイル(サービスアカウント経由で作成)を取得する [Translation API Basic を叩いてみる](https://cloud.google.com/translate/docs/basic/translating-text)(BasicはV2、AdvancedはV3) # Gem から API を叩く – [ドキュメント](https://cloud.google.com/translate/docs/reference/libra
元記事を表示

MySQLの外部キー制約(ON DELETE)を指定しているならRailsのdependentは未指定でOK!

今までMySQLの外部キー制約(ON DELETE)とRailsのアソシエーションに設定する`dependent`は、同じ挙動のものを設定しておけばいいだろうと思って特に意識せずに設定していましたが、本当にそうなのか気になったので動作を検証してみました。 # 前提条件 ## MySQLの外部キー制約 今回の検証では、外部キー制約のDELETE時の挙動を検証します。 検証するのは下記の3つです。 * RESTRICT * CASCADE * SET NULL 外部キー制約についての詳細はMySQLのドキュメントをご覧ください。 https://dev.mysql.com/doc/refman/5.6/ja/create-table-foreign-keys.html ## dependent dependentはhas_one/has_many/belongs_toに設定できますが、今回の検証ではhas_manyを使います。 検証するのはMySQLの外部キー制約に対応する下記の3つです。 restrict_with_errorはrestrict_with_excepti
元記事を表示

アクティブストレージを使用して itemモデルとアソシエーションを行ったが、

<%= image_tag item.i

元記事を表示

Ubuntu 22.04にJupyter NotebookとIRubyをインストール(pyenv, rbenv, Bundler を使用)

– それぞれのバージョンが上がった以外は[前回の Ubuntu 18.04 のとき](https://memo88.hatenablog.com/entry/2020/06/07/112841)からあまり変わっていません – 手軽に試したい場合は公式の Docker イメージを使うのが良いと思います([IRuby の README](https://github.com/SciRuby/iruby/blob/master/README.md) を参照) # バージョンなど “` Ubuntu 18.04(コンテナ外の作業環境) anyenv pyenv Python 3.10.3 rbenv Ruby 3.1.2 jupyter 1.0.0 jupyter_core 4.10.0 notebook 6.4.11 iruby 0.7.4 “` # Docker の用意
元記事を表示

rspecで該当部分のSQLのログをコンソールに出力する

# 背景 実際にどんなSQL出てるのか見たい。 ローカルで単発想定。 belongs_toのvalidationでSQL呼ばれてるとかに気付くことができる。 # 出力方法 “`.rb # before # subject { described_class.start!(user_id: user.id) } # after subject do user_id = user.id using_sql_logger do described_class.start!(user_id:) end end “` こう書き換えるとSQLが出力されるようにした。 # 準備 “`spec/support/sql_logger.rb # frozen_string_literal: true module SqlLogger def using_sql_logger cached_logger = ActiveRecord::Base.logger ActiveRe
元記事を表示

rails twitterみたいに投稿してからの時間を表示 完全版

rails でTwitterのように投稿時間を「何分前」と表示したい場合 ステップ1  posts controoller のcreateアクションでPost .newにcreated_at:        params[:created_at])を追加する ステップ2  index.htmlで投稿一覧をつくる。(これは自分の作りたいものによって変わる) ステップ3  表示したいview(私の場合index.html)で<%= time_ago_in_words(post.created_at) %>前 を書く。 ステップ4  about 1 hour 前 や  1day 前         などが表示されるようになる。 ステップ5  config.time_zone = “Asia/Tokyo”         config.i18n.default_locale = :ja   をconfig/application.rbで入力する ステップ6  config/locales/en.yml で  ja: datetime: distance_in
元記事を表示

jQueryインストール

こんにちは 未経験から転職を目指すものです 今回はrailsアプリに jQueryを入れて 画面に動きをつけていこうと 思います。 ## 環境 * macOS Monterey 12.3.1 * Ruby 3.1.2 * Bundler 2.3.10 * Rails 6.1.4.7 # jQueryインストール まずはjQueryをインストールしていきます。 rails5以前はjquery-railsというGemをインストールするのが 主流のようですが webpacker管理するには yarnコマンドを使用しないといけないので、 yarnを使用してjQueryをインストールしていきます。 “` $yarn add jquery yarn add v1.22.18 [1/4] 🔍 Resolving packages… [2/4] 🚚 Fetching packages… [3/4] 🔗 Linking dependencies… [4/4] 🔨 Building fresh packages… success S
元記事を表示

Railsのdeviseでパスワードリセット時にメールアドレス以外の値もチェック項目として使用する

# はじめに こんにちは。 Rails書き始めて4ヶ月になりました。 今回はdeviseを使用したユーザ認証基盤において、パスワードリセット時にメールアドレス以外の値もチェック項目として追加してみました。 参考になれば幸いです:bow: # 結論 以下では、emailとusernameの2つの値でチェックしています。 “`ruby:user.rb class User < ApplicationRecord devise reset_password_keys: %i[email username] end ``` あとは、formでusernameもPOSTされるようにすればOKです:ok_hand: # 解説 パスワードリセット時のkeyは以下で`email`がデフォルトで設定されています。 https://github.com/heartcombo/devise/blob/main/test/rails_app/config/initializers/devise.rb#L135 こちらを上書きすることでkeyを増やすことができます。 上書きはconfig
元記事を表示

非同期時の送信ボタン制御について

# 記事の内容 非同期での送信ボタン制御を実装する中で色々と躓いたため、備忘録も兼ねて記録として投稿しました。 今回は、XMLHttpRequesを使用して JavaScript から非同期的にデータを送信する方法をご紹介いたします。 # 完成形 [![Image from Gyazo](https://i.gyazo.com/0b3d2fa3696586e4a03339fcda9dc771.gif)](https://gyazo.com/0b3d2fa3696586e4a03339fcda9dc771) # 完成形のコード modelオプションに設定している`@pdf`は、コントローラで定義しているインスタンス変数になります。 `gem`は`wicked_pdf`を使用しており、ここではPDFファイルを生成する処理を記述しております。 https://qiita.com/inoue9951/items/4498e5d130702d884352 ※ コントローラ、フォーム部分は一部割愛しております。 “`ruby:order_page.html.erb <%= form
元記事を表示

Ruby で Translation API を叩く

# ゴール 以下を ruby から叩く。 https://cloud.google.com/translate [500,000 文字 / 1 ヶ月までは無料](https://cloud.google.com/translate/pricing)なので、とりあえず Translation API Basic # 事前準備 具体的には、[こちら](https://cloud.google.com/translate/docs/setup) – GCPのプロジェクト(課金の有効化)を作って – 翻訳APIを有効にして – 認証JSONファイル(サービスアカウント経由で作成)を取得する [Translation API Basic を叩いてみる](https://cloud.google.com/translate/docs/basic/translating-text)(BasicはV2、AdvancedはV3) # Gem から API を叩く – [ドキュメント](https://cloud.google.com/translate/docs/reference/libra
元記事を表示

MySQLの外部キー制約(ON DELETE)を指定しているならRailsのdependentは未指定でOK!

今までMySQLの外部キー制約(ON DELETE)とRailsのアソシエーションに設定する`dependent`は、同じ挙動のものを設定しておけばいいだろうと思って特に意識せずに設定していましたが、本当にそうなのか気になったので動作を検証してみました。 # 前提条件 ## MySQLの外部キー制約 今回の検証では、外部キー制約のDELETE時の挙動を検証します。 検証するのは下記の3つです。 * RESTRICT * CASCADE * SET NULL 外部キー制約についての詳細はMySQLのドキュメントをご覧ください。 https://dev.mysql.com/doc/refman/5.6/ja/create-table-foreign-keys.html ## dependent dependentはhas_one/has_many/belongs_toに設定できますが、今回の検証ではhas_manyを使います。 検証するのはMySQLの外部キー制約に対応する下記の3つです。 restrict_with_errorはrestrict_with_excepti
元記事を表示

OTHERカテゴリの最新記事