- 1. 配列のプロパティから特定の文字列を含むデータを取得する方法
- 2. =は代入だよ。変数は箱だよ。って話【初心者向け解説】
- 3. rubyの例外処理のまとめ
- 4. Railsのminitestで、ngram検索のテスト実装時に苦戦した話
- 5. 【Ruby】Date で月末の日付を得る
- 6. 本番稼働中のRailsアプリでダウンタイムを発生させずにカラム名を変更したい
- 7. 「Ignoring 〜 because its extensions are not built.」が表示されるバグ(メモ)
- 8. [py2rb] callable
- 9. [py2rb] itemgetter
- 10. Date Shifting in Ruby
- 11. [py2rb] type クラスの動的定義
- 12. [py2rb] itertools.islice
- 13. rubocop で inheritance を利用しルールや設定が重複してしまった際に設定を統合する方法
- 14. M1 Mac の Docker で gem install grpc に失敗するときの対策
- 15. RailsとVue.js3のSPAアプリにDeepL apiを導入する
- 16. splitメソッドとそれに関連するメソッドの解説
- 17. Rails7でspring起因でrails consoleが立ち上がらなかった問題の解決方法
- 18. 【Jbuilder】部分テンプレートでハッシュのオブジェクトを使いたい
- 19. Hamlの基本
- 20. rails 7.00における “cannot load such file –sassc”の解決法
配列のプロパティから特定の文字列を含むデータを取得する方法
# はじめに
この記事は、エンジニア経験1年の大学生が実務で勉強になったこと、詰まったことをまとめています。間違っている箇所などがございましたら、指摘していただけると幸いです。
※モデル名やプロパティ名など詳細につきましては、架空のものに変更しております。# 前提
– Ruby: 2.7.5
– Rails: 5.2.4.6
– Neo4j: 9.2.4# 経緯
実務では社内で使用するツールの開発に携わっており、「データを更新することができない」と報告があった。原因を調査していくと、特定の文字列を含むURLを入力することで、データの更新ができないことがわかった。
そこで、ビジネスの方と話し合い、バリデーションを追加することになった。既存のデータにも特定の文字列を含むURLが存在するため、rakeタスクで該当の文字列を含むURLを削除することになった。
ただ、その該当の文字列を含むURLを取り出すことに詰まった。# 失敗した方法
“`
[1] pry(main)> Company.as(:c).where(“c.links =~ ‘.*/hogehoge/.*'”)`
=は代入だよ。変数は箱だよ。って話【初心者向け解説】
# 概要
プログラミングスクールのメンターをしていて、「記事通りに実装したのにうまく動きません。エラーも出てません」って場合がよくあります。自分も初心者の頃は何も愚直に記事通りに実装していたのですが、そこからもう一歩進んで、プログラミングを構造的に理解して実装しよう!という内容です。
そもそものコードの意味や、やってることの意味を理解していきましょう!
# 前提
RailsでWebアプリケーションを作成しています。
実装している機能は以下の通りです。
各機能の解説はここでは省きます。Googleさんに聞いてください!– 投稿機能
– 一覧表示機能
– 検索機能
– タグ機能
– ページネーション機能要するに複数個の機能をつけているって状態ですね!
# 実際のコード
“`ruby:posts_controller.rb
def index
@posts = params[:tag_id].present? ? Tag.find(prams[:tag_id]).posts : Post.all
@posts = Post.all
@posts = Pos
rubyの例外処理のまとめ
ruby silverの勉強をしていく中で間違えたところがあったのでその解説記事を挙げていきます。
例外処理は、rubysilverでは、この問題は頻繁に出てくるので重要な問題です。
##例外処理とは?
例外処理とは、
**もともと想定されている値などが入力されたときに、どんな処理をするのか?**を書くことをいうんです。
例えば、よく知られているのはNomethoderror, Nameerror, Argumenterror, Syntaxerror などがありますね。
これも立派な例外処理なんですね。##例外処理の書き方
結論からいうと、以下のような書き方になります。“`
begin
実行するコード
rescue
例外が発生した時に、実行するコード
else
例外が発生しなかったときに、実行するコード
end
“`意外とシンプルなんですね。
では、実際に具体的なコードを書いてみていきましょう!“`
begin
puts hoge
rescue => e
p e
p e.class # 例外の種類
p e.message # 例外
Railsのminitestで、ngram検索のテスト実装時に苦戦した話
検索機能の実装時に全文検索を実装する為、Like検索ではなくMySQLのN-gramを用いて実装を行いました。
実装はスムーズにできたのですが、minitest実行時にハマったのでよければ参考にしてください。
N-gram自体が何なのかについては、下記の記事が非常に分かりやすく記載して下さっていたので、参考にしてみてください。
[MySQLでの全文検索(N-gram編)](https://qiita.com/wf-yamaday/items/a123e7b0f79fa799454b#:~:text=N%2Dgram%E3%81%A8%E3%81%AF%E4%BB%BB%E6%84%8F,%E5%BD%A2%E3%81%A7%E8%A1%A8%E3%81%99%E6%96%B9%E6%B3%95%E3%81%A7%E3%81%99%EF%BC%8E&text=%E3%81%A8%E3%81%84%E3%81%86%E5%BD%A2%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99,bigram%E3%82%92%E4%BD%BF%E7%94%A8%
【Ruby】Date で月末の日付を得る
Ruby で,年と月が与えられてその月の月末の日付を得るにはどうするか。
言うまでもなく月末が何日かは月によって異なるし,2 月は年によっても異なる。[Date.new](https://docs.ruby-lang.org/ja/3.1/method/Date/s/civil.html) の仕様の基本を知っていれば簡単なのだが知らなかった(てへ)。
“`rb
require “date”year = 2022
month = 2puts Date.new(year, month, -1) # => 2022-02-28
“`「年・月・日」の「日」を指定する第三引数に負数を与えると,月末から数えた日と解釈されるのであった(`-1` だと末日,`-2` だとその前日,など)。
既に日付オブジェクトが与えられているときに,その月の末日を得るには
“`rb
require “date”date = Date.new(2022, 2, 14)
puts date.then{ Date.new(_1.year, _1.month, -1) }
# => 202
本番稼働中のRailsアプリでダウンタイムを発生させずにカラム名を変更したい
本番稼働中のRailsアプリで、カラム名を変更したいという状況が最近ありました。
単純に `rename_column :models, :before_column, :after_column` とやろうと思いましたが、こうするとダウンタイムが発生してしまうことが分かりました。
そこでいろいろ調査して、実際に自分がダウンタイムを発生させずにカラム名を変更できた方法を書き残したいと思います。
この他にもやり方はいくつもありそうですが、1つの例として参考にしていただけますと幸いです。## 環境
– Ruby 3.0.1
– Rails 6.0.4## 手順
1. カラム追加とデータ移行
2. 既存ロジックの修正とignored_columns指定
3. カラム削除## カラム追加とデータ移行
### カラム追加
リネーム後のカラムを追加します。
“`ruby
add_column :models, :after_column, :boolean
“`### データ移行
`before_column` → `after_column` のデータ移行を行いま
「Ignoring 〜 because its extensions are not built.」が表示されるバグ(メモ)
##環境
– Ruby 2.7.4
– Rails 6.1.4.4##エラー内容
急にコマンドを叩く度に以下のようなメッセージが表示されるようになった。“`
・・・
Ignoring nokogiri-1.12.4 because its extensions are not built. Try: gem pristine nokogiri –version 1.12.4
Ignoring racc-1.5.2 because its extensions are not built. Try: gem pristine racc –version 1.5.2
Ignoring racc-1.5.2 because its extensions are not built. Try: gem pristine racc –version 1.5.2
・・・
“`##解決方法
コマンドプロンプトで以下のコマンドを叩く。“`
gem pristine –all
“`処理に少し時間がかかるが解消された。
以上
[py2rb] callable
# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# callable (Python)
“`python
if callable(func):
“`
https://qiita.com/keishi04hrikzira/items/3864d6c74da76ad3ffdeこちらの記事が分かりやすい。~~独習Pythonには載っていない~~
# defined? (Ruby)
“`ruby
def a; end
b = lambda { |x| p x }
c = 1
class D; end
e = D.newp defined?(a)
p defined?(b)
p defined?(c)
p defined?(D)
p defined?(e)
p defined?(f)
p ‘———-‘
p [a, b, c, D, e]
p [a.class, b.class, c.class, D.class, e.class]# output
“method”
“local-variable”
“local-var
[py2rb] itemgetter
# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# itemgetter (Python)
“`python
def itemgetter(*items):
if len(items) == 1:
item = items[0]
def g(obj):
return obj[item]
else:
def g(obj):
return tuple(obj[item] for item in items)
return g>>> itemgetter(1)(‘ABCDEFG’)
‘B’
>>> itemgetter(1,3,5)(‘ABCDEFG’)
(‘B’, ‘D’, ‘F’)
>>> itemgetter(slice(2,None))(‘ABCDEFG’)
‘CDEFG’
>>> soldier = dict(rank=’captain’, name=’dotterbart’)
>>> itemgetter(‘
Date Shifting in Ruby
Rubyにおける二重山括弧「<<」「>>」についてのメモ。
(環境は Ruby 2.0.0 + Rails 4.2.4)「<<」は文字列の場合は連結、配列の場合は追加となるが、 日付の場合、結論としては月単位の操作を行っていることがわかったが、 どういう理屈で以下の挙動をしているのかよくわからなかった。 ```ruby:ruby require 'date' now = Time.now puts now #=> 2022-01-28 12:43:10 +0900
# 「<< N」で Nヵ月前 puts Date.new(now.year, now.month, 1) << 2 #=> 2021-11-01
puts Date.new(now.year, now.month, -1) << 2 #=> 2021-11-30
puts Date.new(now.year, now.month, -1) << -1 #=> 2022-02-28# 「>> N」で Nか月後
puts Date.new(now.year, now.month, -1) >> 2 #=> 2
[py2rb] type クラスの動的定義
# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# type (Python)
“`python
@classmethod
def _make_chain(cls, sequence_maker):
if isinstance(sequence_maker, type):
tp = type(‘%sChain’ % sequence_maker.__class__.__name__, (cls,), {
‘sequence_maker’: sequence_maker
})
else:
tp = type(‘FunctionChain’, (cls,), {
‘sequence_maker’: staticmethod(sequence_maker)
})
return tp
“`
https://www.shoe
[py2rb] itertools.islice
# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# islice (Python)
“`python
def _get_by_slice(self, slc):
self.reset()
value = list(islice(self, slc.start, slc.stop, slc.step))
return value
“`
https://qiita.com/shihono/items/1613f7c6c1b096256bd3分かりやすい記事。
# どうする (Ruby)
“`ruby
def islice(iterable, *args)
start = args[0] || 0
stop = args[1] || Float::INFINITY
step = args[2] || 1
cnt = 0
if iterable.is_a?(String)
it = iterable.split(”).to_enum
else
rubocop で inheritance を利用しルールや設定が重複してしまった際に設定を統合する方法
## これはなに
– `rubocop` には Inheritance というオプションがあり、設定を複数ファイルに記述またはリモートのファイルを参照し、読み込むことができる
– Inheritance の設定をしても、ルールが重複している場合、意図したルールが適用されなかったため対応した際のメモを記事にしました## Inheritance とは
Rubocop のルールは `rubocop.yml` に設定を記載することが多いが、共通の設定を読み込む場合 remote URL を指定したり、 Gemfile 等に定義している gem の中から定義を参照できます
`rubocop –auto-gen-config` のコマンドを実行して生成する `.rubocop_todo.yml` も `inherit_from` で読み込むため、自然に利用している人も多いはずです`inherit_from` の詳細については、以下URLの「Inheriting configuration from a remote URL」を確認してください
https://docs.ruboco
M1 Mac の Docker で gem install grpc に失敗するときの対策
docker-compose で bundle install したり、ビルドしようとするとエラーが発生。
色々試していたところ、grpc をインストールするステップで必ず失敗していること確認。
“`bash
docker-compose run web gem install grpc#=>
Installing grpc 1.43.1 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
…
省略
…
ERROR: 137
“`alpine Linuxが悪さをしている?という記事を見てビルドイメージを変更するが改善せず。
結論、docker-compose.yml で platform を明示することで動作するようになった。
以下、実行時のファイル内容を残しておきます。
“`shell
# ディレクトリ構成
root/
├ Gemfile
├ Gemfile.lock
├ Dockerfile
└ docker-com
RailsとVue.js3のSPAアプリにDeepL apiを導入する
ポートフォリオ作りの過程でRails×Vue.js3のSPAアプリにDeepL apiを導入したので過程を初学者視点で紹介します。
開発環境にはdockerを使用しています。“`
#version
Ruby 3.0.2
Rails 6.0.4
Vue.js3#開発環境
Docker
docker-compose
“`# APIで実現したいこと
![スクリーンショット 2022-01-27 20.19.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640672/fe122651-feb6-82c8-f52e-2918314ab842.png)
上記の画像の「AI翻訳の結果を表示する」ボタンを押すと上部に表示された日本語文を英訳して表示する。
# DeepL apiの登録
https://www.deepl.com/ja/pro-api?cta=header-pro-api/
こちらから登録します。
50,000文字/1ヶ月の制約はありますが無料プランもあります。登録す
splitメソッドとそれに関連するメソッドの解説
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/e4ed46f9-e4fd-b20f-7f62-cffe9617a99c.png)
ruby silverの勉強をしていく中で間違えたところがあったのでその解説記事を挙げていきます。
#splitメソッド
指定した文字列で分割し、それを配列で返すメソッドです。
基本構文は、
“`
“文字列”.split(区切り文字, 分割数)
“`
論より証拠ということで、実際にコードを見ていきましょう“`
‘Yamada, Satou, Itou, Suzuki’.split(‘,’)
=> [“Yamada”, ” Satou”, ” Itou”, ” Suzuki”]‘Yamada, Satou, Itou, Suzuki’.split(‘u’)
=> [“Yamada, Sato”, “, Ito”, “, S”, “z”, “ki”]
“`
1個目の例でいえば、対象の文字列には、「,」があるので、,を目印に区
Rails7でspring起因でrails consoleが立ち上がらなかった問題の解決方法
# はじめに
現在個人プロジェクトで
– M1 Mac
– Ruby3.1.0
– Rails7.0.1という環境での開発を試しています。今までは
– Intel Core i7
– Ruby2.x
– Rails6.xという環境だったので、やはり動くところ、動かないところが出てきます。
(特に、Docker周りは変なバグを踏まないか戦々恐々としています)今回はRails7のプロジェクトにて、springのバージョンのせいでrails consoleの実行が失敗した件についてです。
# 事象
発生したエラーはこんな感じで、 `bundle exec rails c` を実行した時に発生しました。
“`
/usr/local/bundle/gems/spring-2.1.1/lib/spring/application.rb:103:in `block in preload’: undefined method `mechanism=’ for ActiveSupport::Dependencies:Module
【Jbuilder】部分テンプレートでハッシュのオブジェクトを使いたい
##前提
@book_managerが配列ではなくハッシュのため、“`json.array!“`が使えない。##今まで
ファイル名とインスタンス変数名が同じだと
Railsが部分テンプレートを自動的に予測してレンダリングしてくれていたので、
ファイル名など指定しなくても機能していた。“`api/v1/book_managers/show.json.jbuilder
json.book_manager do
json.partial! @book_manager
end
“`##訳あってファイル名変更
ファイル名を変更した際、下記の様に部分テンプレートを指定してみたがうまく行かない…“`api/v1/book_infos/show.json.jbuilder
json.book_info do
json.partial! ‘api/v1/book_infos/book_info’, collection: @book_manager, as: :book_info
end
“`##うまく行った例
ローカル変数“`book_info“
Hamlの基本
# はじめに
RailsでWebアプリにPay.jpを用いた決済機能を実装しようとしていました。
実装フローを検索していたところ、Hamlを使ってビューが実装されているドキュメントが多く、興味本位で学習しました。
これから学習しようとしている方の参考になればと学習したことをまとめてみました。# TL;DL
・RubyをベースとしたHTMLのテンプレートエンジンのこと
・HTMLよりもシンプルに記述できる
・Ruby / Ruby on Railsでも使われている# 前提知識
・HTML
・Ruby(Rubyがベースになった記法だから)
・Ruby on Rails(Railsで使いたい場合)# 大枠の使い方
① 拡張子がhamlのファイルを作成する(Ex.index.haml)
② 作成した①をhamlコマンドに通す(Ex. haml index.haml index.html )
③ htmlファイルが生成される(Ex.index.html)※ hamlのコマンドオプション(よく使うもの)
-f format → アウトプットのフォーマットを指定(html5)
–
rails 7.00における “cannot load such file –sassc”の解決法
rails7.0.0の影響によるcssの読み込みができなくなるというエラーに遭遇したので、同じ症状で悩まされている方のためになるかと思い、この記事を執筆しています。
railsの7.0.0が昨年に公開されましたが、以前のようにcssを適用させようとすると書き画像のようなエラーが出ることがあります。
![Inkedエラー画面_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2230776/8799d448-a136-a3fc-ce92-0207c09e080a.jpeg)このエラーの解決方法は
“`ruby:Gemfile
46 # gem “sassc-rails”
“`のコメントアウトを削除して、bundle installをすることで解決することができます。
rails7.00以前はこのgemが環境構築の際に自動でinstallされていましたが、7.00以降では標準でインストールされないようです.