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

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

ActiveAdminで検索条件で生SQLを使用する方法

# 概要
ActiveAdminの検索条件を追加するにあたり、ちょっと複雑な条件で検索をかけたかったです。いろいろ検討した結果、生のSQLを組む実装となったので、その方法を残しておきます。

## activeadminの実装
“`app/admin/users.rb
ActiveAdmin.register Article do
filter :search_name, as: :string
end
“`

## Modelの実装
“`app/models/User.rb

SQLはもっと複雑な感じで同じテーブルの外部キーがあったり、joinした先のさらに先のテーブルの項目見たり…

# 検索条件:キーワード
scope :search_keyword, lambda { |keyword|
sql = “SELECT * FROM users LEFT JOIN users u1 ON users.partner1_id = u1.id LEFT JOIN users u2 ON users.partner2_id = u2.id”
User.find_by_s

元記事を表示

rails ネスト機能について

今回はrailsのルーテイングの時に役に立つnestについてまとめて見ました。
ネストを使うとルーテイングの見やすさが一気に上がるので、ぜひこの記事を参考にして見てください。

早速ですが、ネストを理解する前に、掲示板とコメントの関係を思い出してください。

掲示板とコメントの関係ですが、これは、必ずと言っていいほど、掲示板の中にコメントが書かれていますよね。
このQiitaも全く同じ機能で、掲示板を僕が一つ記事を書き、そこに読者様からのコメントがありますよね。
こういう風に一対多(掲示板が1、コメントが多)の関係になっているものはネストでルーテイングを表現してあげましょう。
そちらの方が視覚的にも見やすいです。

具体的には以下をご覧ください。
Boardモデル
“`
class Board < ApplicationRecord has_many :comments end ``` Commentモデル ``` class Comment < ApplicationRecord belongs_to :board end ``` ネストの表現方法は下のよう

元記事を表示

【Rails】2022年度版 Devise + Omniauth でGoogle認証(SNS認証)を丁寧に解説

## 概要

今回は標題の通り、Devise + Omniauth でGoogle認証の実装手順を記していきます。

**なぜ今さら記すことに至ったかですが、参照させていただいた記事を軸に進めていたのですが、所々エラーになってしまったり、プラスで追加しなければいけないものもあるので、今後導入する方の参考になればと思ったからです。**

他のSNS認証でも大枠は同じだと思うので、Twitterなど導入したいものがあれば置き換えて参考にしてくだされば幸いです。

尚、ご指摘箇所がございましたら
ご教授いただけますと幸いです。

## はじめに

では、早速といきたいところですが先に私の環境と前提をお話ししていきます。

– macOS Monterey 12.3.1 (M1)
– Rails 6.1.5
– MariaDB 10.6.7

そして、今回私は`Devise`を導入しており、後ほど`uid`カラムと`provider`カラムを追加するのですが`User`モデルではなく別の`Sns_Credential`モデルに追加する手順で進めていきます。

**また、`Devise`の各種実

元記事を表示

[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):

元記事を表示

activerecord-importの配列の指定でActiveRecordの仕様を理解してなくてハマったところ

### はじめに
update時にbulk insertを使用することがあり、その時にActiveRecordの仕様を理解しておらず詰まったので残しておく。

### 結論

“`rb
company = Company.find(params[:id:)
Employee.import company.employees.to_a, on_duplicate_key_update: [:first_name, :last_name]
# もしくはcompany.employees.all
“`

### 事象
1..nの関係の2つのモデル(Company, employee)があり、n(employee)のデータを更新する場合に1のモデル(User)のインスタンスから取得したn(employee)を引数にしたところ失敗した。

下記の記述で実行すると`Invalid arguments!`が発生する。

“`rb
company = Company.find(params[:id:)
Employee.import company.employees, on_duplicate

元記事を表示

「image_tag モデル名.image」で中身の画像データはあるがビューで表示されないことの解決策 / Rails/アクティブストレージを使用

railsの勉強を始めて1ヶ月の初心者です。
今回はタイトルの解決までの道筋を記事にまとめておきたいと思い、投稿いたします。

### 解決したいこと

中身の画像データはあるが
ビューで保存されない状態を解決したい

##### 現在の状況
————————-
・Railsを使用
・アクティブストレージで画像を投稿・保存している(データは保存されている)
・アクティブストレージを使用しているモデルの名前は「item」
・保存した画像を一覧で表示するためにeach文を使用

###### コントローラー indexアクション
(他のデータも表示したいため.allで取得 / 他のデータは正常に表示されている状態)
“`
def index
@items = Item.all.order(‘created_at DESC’)
end

“`

###### indexのビュー
“`
<% @items.each do | item |%>
   <%= image_tag item.image, class: "item-

元記事を表示

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

元記事を表示

【Rails/MySQL】bundle installでgem mysql2がインストールできない時の解決法

## 環境
macOS Monterey:12.3.1
Ruby:3.1.0
Ruby on Rails:6.1.5
Bundler:2.3.12
MySQL:8.0.28(Homebrew3.4.10でインストール)

## エラー時の状況
1. RailsでMySQLを使うために“rails new -d mysql“を実行
1. bundle installの所でエラーが発生(mysql2のインストールに失敗していた)

上記のエラーの解決法を紹介します。

## エラーログ
“`shell
kazunoko@macbook test % rails new -d mysql
省略
run bundle install
Fetching gem metadata from https://rubygems.org/………..
Resolving dependencies….
省略
Gem::Ext::BuildError: ERROR: Failed to build gem native extensio

元記事を表示

Render.com にRailsアプリをデプロイ / 設定でつまったところ紹介

## はじめに

 さくらVPSヘのデプロイは中止した。非常にややこしいことになってきたためだ。また別記事にまとめる。もっと簡単にデプロイする場所を探して、最近流行りつつあるRender.comを使った。

## Render.comとは

https://render.com/

 PaaSのひとつで、Herokuよりも価格が安く柔軟に対応できるらしい。Renderの公式サイトで以下のような挑戦的な記事があった。

https://render.com/render-vs-heroku-comparison

 どちらも無料でつかえるプランがあるし、速度については比較してみないと違いがよくわからない。

## 設定でつまったところ

 ちょー簡単にデプロイまでできるのだが、すこしつまったところがあった。Render.comでは「Build Script」というスクリプトを書いて、デプロイの際にそれが実行されるようにしている。

https://render.com/docs/deploy-rails#create-a-build-script

ただ、私の場合はなぜかそれが反映され

元記事を表示

【Rails】deviseのviewsをカスタマイズする方法

Rails6で`$ rails generate devise:views`をして得たデフォルトのviewsをカスタマイズしようとしたらうまくいかなかったです。

[deviseのgithub](https://github.com/heartcombo/devise#configuring-views)をみてみると下記の文が書いていました。

>If you have more than one Devise model in your application (such as User and Admin), you will notice that Devise uses the same views for all models. Fortunately, Devise offers an easy way to customize views. All you need to do is set `config.scoped_views = true` inside the `config/initializers/devise.rb` file.

和訳すると。

>一つ

元記事を表示

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

元記事を表示

accepts_nested_attributes_forで子要素を保存する時にfirst使ってはいけない

accepts_nested_attributes_forにおいて、最初のデータの保存がうまくいかないケースがあった。

## 前提

“`ruby
# app/models/estimate.rb

class Estimate < ActiveRecord::Base has_many :estimate_items accepts_nested_attributes_for :estimate_items end ``` ## ❌ ダメなコード ```ruby # rails console $> est = Estimate.find(1)
$> puts est.estimate_items.first.name
=> “test1”
$> est.estimate_items.first.name = “hoge”
$> est.save!
$> puts est.estimate_items.first.name
=> “test1” # 「hoge」が保存されてない!
“`

## ?‍♂️ OKなコード
“`ruby
# rails consol

元記事を表示

経験ゼロの新人が1ヶ月でウェブアプリを作らされるヤバい研修 part 1

ウチ(ダイレクト出版)のエンジニア新人研修(今回は俺を含めて新人2人)で、知識ゼロ、経験ゼロから1ヶ月でこんなものを作った↓

![スクリーンショット 2022-04-18 9.28.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496677/531e0c4a-0f2e-4d3e-d384-059f79cb431b.png)

アプリ名は「TeaTime」。社員間のコミュニケーション不足を解消するために、月に一度いい感じのお茶会をセッティングして、社員同士でお茶してもらうというもの。ダイレクト出版ではslackを使って業務のやりとりをしているので、slackと連携してログインして、botから自動でお茶会の招待状やリマインドが届くようになっている。

この研修は、プログラミング初心者が実際に使うアプリを開発することで、RailsやMySQL、Gitなど業務に必要な知識と経験を爆速で得て、本流の開発(自社開発のアプリやシステム)にスムーズに携わることができるようにすることを目的としている。

ポイ

元記事を表示

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

元記事を表示

【Ruby on Rails】railsでスタディープラスっぽいもの作ろうとしてみた(グラフ表示)

# はじめに
自分のスキルアップのために人気アプリ、スタディープラスのトレースをしていてその過程でちょっと悩んだところがあったので備忘録として記事として残します。もし、もっとスマートな書き方があったらご教示ください。

# 実装
実装に際して前提として①基本となる投稿機能(Tweetモデル) ②deviseを用いたユーザー機能 の2つが実装されているという前提で作成を進めていきます。
また、tweetsテーブルにstrig型でtagという名前のカラムを事前に追加しておくようにお願いします。

## カテゴリの選択と追加
### 1.モデルの作成とアソシエーション
勉強した科目などのカテゴリを追加・保存するためのテーブル(tagsテーブル)の作成を行います。
コマンドプロンプトで以下のコマンドを実行してください
“`
rails g model Tag name:string
“`

“`
rails db:migrate
“`

また、アソシエーションの設定もしておきましょう!

“`ruby:tweet.rb
has_many :tags
“`

“`ruby:

元記事を表示

Rails(API mode) で、passwordを持ったUserの作成

## 手順
“`sh
rails new pwsample -d postgresql –api
cd pwsampple
rails db:create
“`

`./Gemfile`のbcryptが含まれる行のコメントを外す。
“`
gem “bcrypt”, “~> 3.1.7”
“`

Userモデルとコントローラーを作成。
passwordは、`password_digest`というカラム名にする。
“`sh
rails generate model user name:string email:string password_digest:string
rails generate controller users
rails db:migrate
“`

`./config/routes.rb`に`resources :users`を追加
“`ruby:./config/routes.rb
Rails.application.routes.draw do
resources :users
end
“`

`./app/models/user.rb`に

元記事を表示

destroy action実行時にcouldn’t Item find with ‘id’=1のエラー表示

# はじめに
 実装中のフリマアプリにて、「ログイン状態の場合にのみ、自身が出品した商品情報を削除できること」という実装条件に合わせて記述したのち、商品詳細ページから削除ボタンをクリックすると、下記のエラーが発生しました。
結論、エラー内容とは関係なく、destroyアクション処理後の挙動を記述していないことが原因のようでした。
![スクリーンショット 2022-05-05 18.34.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655610/573f5dda-8eaf-f86c-a72c-578109c6f946.png)
 上記エラー文を確認すると、 「ItemsControllerに記載しているdestoroy actionを実行したがid1が見当たらない」といった指摘がされているようでした。

# 仮説・検証

### 仮説1
 エラー文の通り、idが受け渡されていない事が原因でエラーが発生しているのではという仮説のうえ、MVCの流れに沿って下記の検証作業を行いました。

### 検証

元記事を表示

OTHERカテゴリの最新記事