Rails関連のことを調べてみた2022年12月13日

Rails関連のことを調べてみた2022年12月13日

Docker で Rails と OpenSearch を連携させる【環境構築】

# はじめに

docekr-composeを使ったRailsアプリケーションにて
OpenSearchを利用するための開発環境 構築手順をまとめます。

## 方針

下記2点の理由から、gem `elasticsearch-rails` を使ってRailsとOpenSearchを連携させます。
– rubyとopensearchを使ったクライアントは2022/12/11時点では公式に存在しない
– OpenSearch1系はElasticSearchの7.10をサポートしている

# 実行環境

“`config: バージョン情報
Docker: 20.10.14
docker-compose: 1.29.2
ruby: 2.7.6
rails: 6.0.5
OpenSearch: 1.3.6
“`

## 前提

– docker-composeでrailsが構築できていること
– 検索として扱うModelが存在し、レコードを持っていること
– 今回は例として`Book`Modelを使用

# 開発環境の構築

## OpenSearchをdocker-compo

元記事を表示

ActiveStorage + has_one_attached + S3でもサブディレクトリに入れたい!

# なにがしたいのか
S3にそのまま上げても使えはするんですが、大人の事情で1つのバケットしか使えない等の理由でディレクトリに入れたい時あると思います。
S3にディレクトリの概念は無いんですがそこは便宜上ディレクトリで行かせてください。

確かに`has_one_attached`でも`record.attach(key: ‘images/example.png’)`の形でキーは使えます。
ただ、楽をするためにRailsを使ってるんだ!ってスタンスの自分としては気に食わないわけです。

form_withでフォーム作ってfile_field使ってパラメーター渡すだけで簡単にアップロードしたくないですか??私はしたいです。

## ActiveStorageでフォルダはサポートされていない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96621/165e83b4-4372-2431-8de7-52be2c61856a.png)
https://github.com/rails/rails

元記事を表示

【Rails】gemを使わずに 楽天Apiを動かしてみよう:後編【ハンズオン】

この投稿は、
[DMM WEBCAMP mentor Advent Calendar 2022](https://qiita.com/advent-calendar/2022/infratop_mentor)
の投稿12日目のエントリーです。

11日目は @takumi3488 さんで
[【CSS】テキストの下線(アンダーライン)を太くしたくないですか?僕はしたいです。](https://qiita.com/takumi3488/items/074a995cb4a5313991eb)

## 環境と前提

– ruby 3.1.1
– Rails 6.1.7

https://qiita.com/tomoaki-kimura/items/635b7f136a9967b457b4

↑こちらからの続きとなります。

Apiの理解が・・・という方は是非前編で手を動かしてみて下さい。

## 1.Railsでアプリを作る

### 準備

準備は、 `rails new` をやる準備が整っている前提で進めていきます。

“`bash:bash
$ rails _6.1.7_ new ra

元記事を表示

Rails RuboCop

## はじめに
チーム開発ではコードの規約が大切になります。

規約がなかった場合、「僕はインデント幅2が好きだから2にしとくね」「僕はインデント幅100が好きだから100にしとくね」みたいな感じになってコードの可読性が落ちたり、思わぬエラーを引き起こしたりします。

そのような規約を暗黙の了解ではなく、自動的に適用させられたら嬉しいです。
そんな時に役立つのが“`RuboCop“`です。

## RuboCopとは
Rubyのリンターです。Javascriptだと“`ESLint“`が有名だと思います。
解析するだけでなく、フォーマッターの役割もしてくれます。

#### セットアップ
Railsに導入するものとします。“`Gemfile“`に以下のgemを追加します(rspecを使わない方は4行目は必要ありません)。
“`
gem ‘rubocop’, require: false
gem “rubocop-performance”, require: false
gem “rubocop-rails”, require: false

元記事を表示

Stimulus 3: リアルなものを構築する

:::note
この記事は[Google翻訳](https://translate.google.co.jp/)の結果を編集したものです。
:::

https://stimulus.hotwired.dev/handbook/building-something-real

最初のコントローラーを実装し、StimulusがHTMLをJavaScriptに接続する方法を学びました。 それでは、Basecampからコントローラーを再作成して、実際のアプリケーションで使用できるものを見てみましょう。

# DOMクリップボードAPIのラッピング

BasecampのUIには次のようなボタンが散在しています。

![bc3-clipboard-ui.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238166/a07f03d3-3a96-7438-dfc1-3089312c16df.png)

これらのボタンのいずれかをクリックすると、BasecampはURLや電子メー アドレスなどのテキストをクリップボード

元記事を表示

デザイン用gem(bulma-rails)

# bulma-railsについて
デザイン用のgemです。
Github↓
https://github.com/joshuajansen/bulma-rails

# バージョン
Ruby:2.7.7
Rails:7.0.4

# 導入方法
Gemfileに`gem “bulma-rails”`を書き込み、ターミナルで`bundle install`を行う。

インポートするために、app/assets/stylesheets/application.cssに書き込む。
“`ruby:app/assets/stylesheets/application.css
@import “bulma”;
“`
この際、拡張子を`css`から`scss`に変更する。

これで導入完了です。

元記事を表示

アプリにログイン機能を追加

# 参考記事
参考記事というか、deviseについてはここに全部書いてあります。
https://github.com/heartcombo/devise#starting-with-rails

# バージョン
Ruby:2.7.7
Rails:7.0.4

# gemをインストール
これをやらないと使えないです。
“` ruby:Gemfile
gem ‘devise’
“`
保存後、ターミナルに下記のコードを入力
“`
 bundle install
“`

# セットアップ
インストールが完了すると、色々出てくるので指示通りに進めていきます。
※保存を忘れずに
![スクリーンショット 2022-12-13 1.43.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2018163/4c86643b-dc2b-f30d-109a-c87db58aa05a.png)

[1] `config/environments/development.rb`に以下のコードを書く。
“`ruby

元記事を表示

Railsでdistinctとpluck/select連用する時ハマった件

# TL;DR

前後文に`distinct`が存在する(可能性がある)場合、`pluck`または`select`を使うとき、`id`(またはその他一意性識別子)を一緒に入れないと、場合によって見つかりにくいBugが発生します。

## OK:
“`ruby
user.purchases.distinct.pluck(:id, :amount).map(&:last).sum
# または
user.purchases.distinct.select(:id, :amount).map(&:amount).sum
“`

## NG:
“`ruby
user.purchases.distinct.pluck(:amount).sum
# または
user.purchases.distinct.select(:amount).map(&:amount).sum
“`

# 起因
仕事で開発を行なった通販システムで、ある日から「会員の購入金額の合計データを出力する」という要望がありました。
開発する際に、「購入金額の合計を取るには、わざわざ全件をインスタンス化しなくていいじゃない」と

元記事を表示

データ移行をして学んだ3つのこと

## はじめに
はじめまして。
リンクアンドモチベーションでエンジニアをしている田中です。
まだまだ若輩者のエンジニアですが
直近、データ移行タスクに挑戦する機会があり、大事な観点を特に3点学んだのでこの場でアウトプットさせていただきます。

## 構成
– 今回担当したデータ移行タスク
– 躓いたことと学び
– 今後の展望

## 今回担当したデータ移行タスク
今回担当した移行タスクは3点です。移行タスクファイルはrailsを使って作成しています。
– 社内Aアプリケーションから、社内Bアプリケーションへマイクロサービス化に伴ってDB分離するための移行
– 社内Aアプリケーションから、外部Cアプリケーションへマイクロサービス化に伴ってAPI分離するための移行
– 社内AアプリケーションのAテーブルにおいて、AカラムからBカラムへ、カラム名変更に伴う移行

## 躓いたことと学び
特に3点、ベテランエンジニアの方からFBいただく中で学びが大きかったので、ピックアップして書きたいと思います。

### 要件は正しいか 〜移行対象のデータ範囲が決まっていない〜
エンジニア側の要件定義では移

元記事を表示

Railsアプリのローディングまとめる

eager load と hot reload を混合していたのでまとめる。

## Definitions

– `eager loading`
– = load all files when booting up a Rails server.
– Configured with `config.eager_load = true`
– `reloading` (= hot reloading)
– = reflect the code changes immediately to a runninng Rails server before processing the next request.
– Configured with `config.cache_classes = false`

To reflect code changes in rails console, hit `relaod!` in the console.

## Default configurations in Rails 7.0.4

| | develop

元記事を表示

既存MVCのRailsプロジェクトを最速でフロントとバックエンドに分離する方法

# はじめに
RailsはMVCフレームワークとしてよく使われていますが、昨今はRailsをAPIモードで利用して、フロントはReactなりVueなりで書くことが多いかと思います。
とはいえその流れはここ数年で、少し前まではRailsデフォルトの方法としてフロント側もerbファイルで書いているプロジェクトがほとんどだったと思います。
そのまま流れで、運用しているプロジェクトもたくさんあると思いますが、パフォーマンスや保守性のため分離したいと考えている人も多いかと思います。

本記事ではなるべく低工数でフロントエンドとバックエンドを分離する方法を考えました。
色々試行錯誤してこういう結論に達したというだけなので、アドバイスあれば是非お願いします!

# 結論
先に結論だけ書いておくと、「Get系はGraphQL、他はRestAPIで書く」です。

# 前提条件
MVCで書かれているので、基本的にAPI仕様書はなく、テストもほとんどない状態
ロジック自体はあまりいじりたくないので、可能な限り既存コードを転用したい

# 採用した施策

### GraphQL
Get周りは[graphql-

元記事を表示

ぼくのかんがえたさいきょうのRails APIリファクタリング

# はじめに
テキトーにタイトル考えたんですが「ぼくのかんがえたさいきょうの」って元ネタがキン肉マンの子供からの超人提案募集らしいですね。
子供たちが考えた超人を見るが如く、優しい目でご指摘頂けると助かります。

本題に入りまして、Railsは最初のうちは、Rails wayに乗ってれば結構サクサク書けるんですが、ある程度規模が大きくなってくると途端に管理が難しくなります。
ControllerとModelくらいしか使ってないプロジェクトをリファクタリングしていく方法を考えました。
そこまで大きくないプロジェクトなら、最初からこの方式でAPI組んでも良いかなと思います。

しっかりリファクタリングする時間があればいくらでもできると思うので、ある程度方針だけ決めて、それに沿って効果が高そうなものをまとめていきます。

# 基本方針

## Controller
ControllerはAPIのinputを受け取るだけのレイヤーとして使います。
ロジックは全て後述するLogicにまとめて、返り値の整形はSerializerに任せてしまうのが良いと思います。
ただし、Controller内では

元記事を表示

【Rails】SorceryでTwitter認証【2022年12月版】

# 概要
ポートフォリオの作成で[Sorcery](https://github.com/Sorcery/sorcery)を使ったTwitterログイン認証を実装しました。

rails側は基本的には[公式のwiki](https://github.com/Sorcery/sorcery/wiki/External)に沿って進めれば問題ないのですが、ポイントで変更が必要で、Twitter Develpersの申請周りが変化していたので、2022年12月時点で成功した方法をキャプチャーを交えて記録します。

## 実行環境
この記事は以下環境で動作を確認しました。
Ruby 3.1.2
Rails 6.1.7

## 完成版のイメージ

ログイン後にプロフィールを確認するとTwitterのメールアドレス(email)、名前(name)、自己紹介(description)が取得できている状態をゴールとしました。
rails tutorial 8章リスト8.28がREDから変わらない人に向けて

同じ所で躓いてる同士に向けて。
rails tutorial 8章リスト8.28がGREENにならず、以下ログが出力される。
“`
“foo@bar..com” should be invalid
“`

### 対応内容
/app/models/user.rb
正規表現を修正
“`diff
class User < ApplicationRecord before_save { self.email = email.downcase } validates :name, presence: true, length: { maximum: 50 } - VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i + VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+\.[a-z]+\z/i validates :email, presence: true, length: { maximum: 255 }, format: { wi

元記事を表示

ERB が使われている既存の web システムへ Slim 導入に至るまでの話

これは [Livesense Advent Calendar 2022 DAY 12](https://adventar.org/calendars/7971) の記事です。

## はじめに
ビューに [ERB](https://ja.wikipedia.org/wiki/ERuby) が使われている web システムへ [Slim](https://github.com/slim-template/slim/blob/master/README.jp.md) 導入に至るまでにあったことを記載しています。
[Ruby On Rails](https://rubyonrails.org/) で構築された web システムであることを前提としています。
[Slim](https://github.com/slim-template/slim/blob/master/README.jp.md) 導入時の判断材料の一つになれば幸いです。

## Slim とは何か?
– [Ruby On Rails](https://rubyonrails.org/) に対応した軽量、高速なテンプレートエン

元記事を表示

Stimulus 2: こんにちは、Stimulus

:::note
この記事は[Google翻訳](https://translate.google.co.jp/)の結果を編集したものです。
:::

https://stimulus.hotwired.dev/handbook/hello-stimulus

Stimulusがどのように機能するかを学ぶ最良の方法は単純なコントローラーを作成することです。 この章ではその方法を説明します。

# 前提条件

先に進むにはStimulusを探索するための事前構成済みの空白の状態である[`stimulus-starter`](https://github.com/hotwired/stimulus-starter)プロジェクトの実行中のコピーが必要です。

[Glitchで`stimulus-starter`をリミックスして](https://glitch.com/edit/#!/import/git?url=https://github.com/hotwired/stimulus-starter.git)、何もインストールせずにブラウザーで完全に作業できるようにすることをお勧めします。

元記事を表示

【個人開発】日本各地の三つ星ホテル級のきれいなトイレが探せる! 検索サービス『三つ星トイレ』を作りました

## はじめに
![ogp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2988428/46222074-27b0-7e16-8def-5675ed649ae8.png)
はじめまして、[しゅとーむ](https://twitter.com/shutooorm02)と申します。
2022年10月に、日本各地のきれいなトイレが検索できるトイレ検索サービス『[三つ星トイレ](https://www.mitsuboshi-powder-rooms.jp/)』をリリースしました!

当初は、出先でもきれいなトイレを使いたい女性の方をターゲットとして想定していましたが、ありがたいことに男性の方にもご好評をいただいています。(うれしい誤算)

【サービスURL】

https://www.mitsuboshi-powder-rooms.jp/

【Github URL】

https://github.com/shutorm02/mitsuboshi_powder_rooms

本記事では、『三つ星トイレ』のサー

元記事を表示

RSpecでElasticsearchを使用しているモデルのテストでのみインデックスの初期化を行う方法

# TL;DR

RailsのメソッドをRspecでテストする際に、Elasticsearchを使ったモデルに対してのテストの実行時にのみ、実行前後でElasticsearchのインデックスを初期化する処理を入れる方法です。

# やりたかったこと

`elasticsearch-rails`gemを用いたRailsのアプリケーションにおいて、下記のようにElascticsearchを用いて検索や絞り込みを行うメソッドを実装しました。

“`ruby
class SampleClass < ApplicationRecord def search(filter_ids, target_ids: [], min_price: nil, max_price: nil, size: 200) __elasticsearch__.search({ size: size, query: build_query(filter_

元記事を表示

RailsのYAMLファイルに正規表現を書いて使用する

# TR;DR

YAMLファイルから正規表現を読み込むようにするには`!ruby/regexp`に続けて正規表現を記述すればよいです。

# 背景

同じアプリケーションを、複数の国や、いくつかの企業毎に環境を分けて使用したいことがあります。
このように場合の対応策のひとつとして、アプリケーションのコードは同じものを使用しつつ、環境ごとに読み込むYAMLファイルを変えることで細かな設定を調整するやり方があります。

今回もその対応をしてたところ、文字列やフラグの値などはスムーズにYAMLファイルに定義して出し分けができたのですが、URLなどの正規表現を環境ごとに変えたかった際にどうすればいいかわからなかったので少し調べてみました。

# RailsにおけるYAMLファイルの読み込み処理

通常はYAMLファイルの読み込みは下記のように行います。

“`ruby
path = # YAMLファイルへのパス
REG = YAML.load_file(path).symbolize_keys
“`

しかし、今回はconfigをいうgemを使って`Settings`に読み込んでいました

元記事を表示

Ransackで作るラクラク検索

一覧画面で検索機能を実装するにあたって、Ransackを使うと
どんな感じになるのか気になったので、実装してみました!

:::note warn
前提として、投稿機能の実装が必要ですが、その点は省略しています
:::

# 導入
まず、Gemfileを編集します。
“`rb:Gemfile
gem ‘ransack’
“`

次に、以下のコマンドを実行します。
“`zsh:ターミナル
bundle install
“`

# ルーティング
“`rb:routes.rb
Rails.application.routes.draw do
resources :posts do
collection do
get ‘search’ => ‘posts#index’
end
end

root ‘posts#index’
end
“`
今回は一覧画面での実装としているため、検索時に
`posts#index`を指定しています。

# Viewの編集

“`erb:index.html.erb

検索

<%=

元記事を表示

OTHERカテゴリの最新記事