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

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

bundle install 時の idn-ruby エラー

## エラー内容
環境構築時の`bundle install` で `idn-ruby`に関するエラーに遭遇。

“`
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory: /Users/ynamiki/Desktop/sora/vendor/bundle/ruby/2.6.0/gems/idn-ruby-0.1.0/ext
/Users/ynamiki/.rbenv/versions/2.6.6/bin/ruby -I /Users/ynamiki/.rbenv/versions/2.6.6/lib/ruby/site_ruby/2.6.0 -r ./siteconf20220722-10264-bfer1i.rb extconf.rb
checking for -lidn… no
ERROR: could not find idn library!

Please install the GNU IDN library or alternati

元記事を表示

ログインの有無でアクセス制限をする方法【Rails】

# 目的
SNSサイトにて、ログインの有無でアクセス制限したいときの処理をメモにまとめます。

# サイト構成
作成したサイトの構成は下記です。

“`ruby:routes.rb
# ログイン中はアクセス制限
get “/” => “users#login_form”
post “/login” =>”users#login”
get “/new” => “users#new”
post “/users/create” => “users#create”

# ログアウト中はアクセス制限
get “/edit/:id” => “users#edit”
post “/users/update/:id” => “users#update”
post “/logout” => “users#logout”
“`

# current_userの準備
ログイン中のユーザーを`@current_user`で定義します。
これは全てのコントローラで使用する変数なので、`application_controller`で定義し、`before_action`に設定します。

“`ruby:ap

元記事を表示

【Rails】APIモードかつクロスオリジン間でCookieやSessionを使う方法【SPA】

# 環境
– Ruby 3.1.2
– Rails 6.1.6
– Vite 2.9.9
– Vue 3.2.25
– Docker
– Google Chrome (バージョン:103.0.5060.53)

# 前提
– RailsはAPIモードで使用
– フロントエンドとバックエンド間は異なるオリジンでの通信

# やり方
APIモードで起動したRailsはそのままではCookieを使うことができません。
なので、まずCookieを使うことができるようにします。

“`ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::API include ActionController::Cookies # 追加 ``` ```ruby:config/application.rb module App class Application < Rails::Application # ... config.middleware.

元記事を表示

Rails6でrails generate scaffoldすると`Unknown alias: default (Psych::BadAlias)`とエラーが出る

## 結論

Gemfileで`webpacker`のバージョンを `~> 5.0`と指定すればエラーが出なくなる。
なぜかはわからない。

## 詳細
### やりたかったこと
Railsアプリでscaffoldを使ってリソースを作りたかった。

### 環境
– ruby 3.1.2
– rails 6.1.6
– bundle 2.2.17

### やったこと
基本的にRailsチュートリアル第2章に従っています。
1. `rails new toy_app`でアプリを生成、`cd toy_app`で移動
1. Gemfileを下記のように書き換え
1. `bundle config set –local without ‘production’`で設定
1. `bundle install`でgemのインストール
1. `rails webpacker:install`
1. `rails generate scaffold User name:string email:string`でリソースを作ろうとする

“` Gemfile
source ‘https://rub

元記事を表示

orderメソッドについてまとめ

## はじめに
初心者なりにまとめたものになりますので、間違いにお気づきの方は、お手数ですが、コメント頂けると幸いです。

内容は、Orderメソッドのまとめになります。

## 目次
– orderメソッド の雛形
– orderメソッド 並び順のオプション
– orderメソッドとallメソッド

## orderメソッド の雛形
変数 = モデル名.order(“カラム名”)
変数:お好みの変数を定義する
モデル名:並び替えたいテーブルを管理するモデルの名前
カラム名:並び替えさせたいカラムの名前

例.
テーブル名: mail
カラム名:id, title, content, user_id, created_at, update_at
mailテーブルのuser_idで並び替えさせたい場合は、以下となります。

hoge = Mail.order(“user_id”)

## orderメソッド 並び順のオプション
hoge = Mail.order(“user_id ASC”)
hoge = Mail.order(“user_id

元記事を表示

Rails7のActionMailerでメールを送ろうとすると`500 Internal Server Error`が出る

## 結論
Railsのバージョンを7.0.2.4以降にすれば解決します。

Rails 7.0.2.4未満に存在するバグだそうです。
本家のリポジトリに同じようなissueが立っていました。
https://github.com/rails/rails/issues/44161

## 詳細
### 環境
– ruby 3.1.2
– rails 7.0.2.3

### やりたかったこと
[Ruby on Railsチュートリアル](https://railstutorial.jp/)に従ってwebアプリを作ってherokuにデプロイし、本番環境からMailgunを使ってアカウント有効化用のメールを送りたかった。

### やったこと
1. `rails generate mailer UserMailer account_activation`で、アカウント有効化メールを送るメソッドを持つMailerを作った
1. `ApplicationMailer`の`default from`を適切なメールアドレスに書き換えた
1. `app/views/user_mailer/ac

元記事を表示

Rails 7.0でないとActiveStorageのvariantに名前をつけられない

# 原因はバージョン
Rails 6.1を使ってるのにRails 7.0向けのガイドを見てました。昨日上司に「バージョン違いに気をつけてね」って言われたばかり!!

教えてもらってなかったらもっとハマってたはず…

# 困ったこと

ActiveStorageを使用して画像を保存することに挑戦していました。[Railsガイド](https://railsguides.jp/active_storage_overview.html#has-one-attached)を読みながら、セットアップや保存処理までは実装できましたが、画像サイズを調整する以下の記述がうまくいきませんでした…。

“`ruby
# Railsガイド ActiveStorageの概要 has_attached_oneより引用

class User < ApplicationRecord has_one_attached :avatar do |attachable| attachable.variant :thumb, resize_to_limit: [100, 100] end end ```

元記事を表示

【Rails】Herokuにデプロイしたら検索機能(LIKE関数)が使えなかった【PostgreSQL】

# 環境
Ruby: 2.6.5
Ruby on Rails: 5.2.4.2
heroku: 7.60.2
PostgreSQL: 14.1

**開発環境**
Cloud9
SQLite3: 3.7.17

# 問題
Cloud9で開発後、herokuにデプロイし、ECサイトの商品検索機能を使ったところ、次の画面に遷移しました。
![スクリーンショット 2022-07-19 18.34.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575953/7aac804a-a2dd-1bcd-5077-cc586a1c5829.png)

“`
We’re sorry, but something went wrong.
If you are the application owner check the logs for more information.
“`
開発環境では動いていたのに、、、

# 原因
`heroku logs -t`コマンドでログを見ると、以下のエラーとヒントが吐かれてい

元記事を表示

カラムの値ごとにeach文を回す方法【Rails】

# 目的
hogesテーブルをジャンルごとに分けて出力したい。

# 目標物の確認
今回作成したいページはこのような見た目です。
![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/8f231299-c076-09ef-5f62-913aaca12367.jpeg)

# MCVの準備
今回の目標物を実現するために最低限必要なファイルは以下です。

## モデル
**Hogeモデル**:メインとなるhogesテーブルのモデルです。
`id`カラム:データ作成と共に自動付与される値
`content`カラム:表示する内容
`genre_id`カラム:今回ポイントとなるカラムです。genreモデルと紐づけるためのカラムです。

**Genreモデル**:Hogeモデルの`genre_id`カラムと紐づけるためのモデルです。
`id`カラム:データ作成と共に自動付与される値。hogeモデルの`genre_id`カラムと紐づけます。
`name`カラム:genre名を設定します。

元記事を表示

htmlサニタイザーの検討

## htmlサニタイザーとは
サニタイズとは、主にHTMLやJavaScriptなどでWebサイトの表示や機能を記述するために用いられる特殊文字を、単純な文字として扱いたい場合に行われる。
なぜサニタイズをする必要があるかというと、Webサイトに設置された入力フォームなどから、悪意のあるスクリプトコードが入力されると、その文字列が解釈・実行されることで様々な被害に遭う恐れがあるためである。

## 想定している読者のニーズ
– ユーザーが自由に使えるオンラインエディタでhtml5の任意のタグを使えるようにしたい
– html5に対応したrubyのサニタイザーを比較したい

## 想定してないニーズ
– html4以前のサニタイズでいいや → [tidyっていうgemがサニタイズもフォーマットもしてくれるのでおすすめ](https://rubygems.org/gems/tidy/versions/1.1.2)
*ただし10年ほどメンテされていないので、そこは注意が必要

## TL;DR
個人としては、sanitizeかloofahの2択だと思っている。
見た感じ

元記事を表示

Rails controller内に登場したbegin rescueとはなんぞや

#### はじめに
実務でバグ改修をしているときにcontroller内に次のような処理を見つけました。
~~~ ruby
def create
begin
# (通常のcreateの処理)
rescue エラーの種類 => e
# (eを使って色々書いてある)
end
end
~~~
beginというものが突如現れました。これはなんぞや?ifたいなものなのか・・・?
これまでRubyの中でbeginなんて記述をしたことがなかったので衝撃を受けました。
このままではバグ改修もできないので、「僕が出会ったこのbeginというものを僕はどれくらい知ってるんだろ〜」と思い、調べてみることにしました。
そうするとbeginを使用する際は基本的にrescueもセットであることもわかりましたので備忘録として残したいと思います。
もしもおかしな点や補足等ありましたら教えていただけると幸いです。

#### 環境(自分のPC)
Ruby 2.6.5
Rails 6.0.5

#### 前提
まず、singerモデル及びsingersコントローラーを作成し、singer.html

元記事を表示

Rails6.1で追加されたmissingがとてもエレガント

# 結論
ActiveRecordのmissingという関数を使えばこんなにエレガントになります。

“`ruby
# missingなし
Master.left_joins(:datas).where(datas: {id: nil})

# missingあり
Master.where.missing(:datas)
“`

# どういうこと?
missingは関連が無いデータを取得するときに使います。例えば
– 利用されていないマスターデータの一覧を取得する(上例)
– 所属する社員がいない部署の一覧を取得する(ex: `部署.where.missing(:社員)`)
– 画像が無い記事の一覧を取得する(ex: `記事.where.missing(:画像)`)

# どうやって利用するの?
has_one/has_many/belogs_toなどのアソシエーションが組んであれば利用できます。

なにはともあれ、missingって響きがカッコいいので多用したい。

# 参考
https://techracho.bpsinc.jp/hachi8833/2021_05_26/1

元記事を表示

form_withの引数について

使用環境
ruby6.1.6
rails2.6.3

# はじめに
はじめまして!Railsを勉強し始めて3か月目の初学者です。備忘録を兼ねて、同じエラーで困っている方のお役に立てればと思います。

# form_with実装時のエラーについて
form_withを使用して、会員情報の編集を実装していた際の更新したいデータは送れているのに保存できなかったエラーの解決方法について書いていきます。

最初は以下のように記述していました。
変更前
“`ruby:app/views/public/users/edit.html.erb
<%= form_with model: @user, local:true do |f| %>
“`
“`ruby:admin/users_controller.rb
def update
@user = User.find(params[:id])
if @user.update(user_params)
redirect_to admin_users_path
else
render :edit

元記事を表示

ActiveAdminの複数バリデーションエラー時の日本語化

# 環境
* rails7
* ActiveAdmin

# 概要
バリデーションに複数引っかかった場合に
「◯◯が入力されていません and △△が正しくありません」と表示されてしまいます。

# 対処
日本語化対応するためにja.ymlの以下に値を変更すればOK!!

“`config/locales/ja.yml
ja:
support:
array:
words_connector: “, ”
two_words_connector: ” and ”
last_word_connector: “, and ”
“`

元記事を表示

【Rails6】deviseのログイン時にエラーが出て認証されないときの対処

## はじめに
`devise`というgemを使用してユーザログインしようとしたときに `Completed 401 Unauthorized` というエラーが吐き出されたので、備忘録として解決策を残しておきます。

今回deviseのモデルとして`user`モデルを作成していますが、適宜ご自身が作成したモデル名で読み替えてください。

また、初めての記事投稿なので拙い文章になることが予想されますが、悪しからずご了承ください。アドバイス等いただけますと幸いです。

## 開発環境
`Cloud9` `Ubuntu 18.04`
`Rails 6.0.4`
`Ruby 2.6.3`
`MySQL 5.7.38`

## 前提
モデル(`app/models/user.rb`)は以下のコマンドで作成済み。
“`bash:ターミナル
rails g devise user
“`

コントローラ(`app/controllers/users/*`)は以下のコマンドで作成済み。
“`bash:ターミナル
rails g devise:controllers users
“`

元記事を表示

「LSEP」という不可視文字の削除方法

[バヅクリ](https://buzzkuri.com)CTOの合原です。
今回、非エンジニアからの依頼で、「LSEP」という記号?文字?の除去作業をシュッと行ったので、まとめたいと思います。

## 前提
当社[バヅクリ](https://buzzkuri.com)では、下記のように、オンラインで、
チームビルディングや研修を目的としてオリジナルのプログラムを提供しています。

とても、とても簡単に説明すると、、、

契約企業から特定のプログラムでのイベント開催の希望が発生すると、
アプリケーション上では、プログラムデータからイベントデータを自動生成しています。

プログラム、イベントそれぞれのデータについてCRUD処理が存在します。

![スクリーンショット 2022-07-20 17.04.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64537/b616cc8f-9030-d4a2-6b4c-1f822830e232.png)

通常企画チームにて、プログラムの入稿や更新、運営担当によるイ

元記事を表示

each文で出力するデータの数を指定したり順番をランダムにしたりする方法【Rails】

# 目的
テーブルからデータを取り出す方法としてeach文を使用するのは一般的ですが、大量のデータから指定したデータ数だけ取り出したいときや、データをランダムで出力したいというときに使用する方法についてまとめます。

本記事は

+ 出力する数を指定する
+ ランダムに出力する
+ 上記2つを組み合わせる

という構成で紹介します。

# 数を指定する
hogesテーブルから10個だけデータを取り出したいという場合は、コントローラとビューファイルで下記の設定をします。

“`ruby:hoges_controller.rb
# 対象のアクション内で
@hoges = Hoge.all
“`

“`ruby:viewファイル
<% @hoges.limit(10).each do |hoge| %>
# ~~~~~
<% end %>
“`
@変数に対して`.limit`メソッドをしてからeach処理をする。というシンプルな流れです。

`.limit`メソッド以外にも、新しいデータや古いデータから任意の数を取り出す方法もあります。
詳細は下記を参照してください。
[【ruby】

元記事を表示

Formオブジェクトで保存したデータを表示させるには

formオブジェクトで複数テーブルに保存したデータをページ上に表示させるのに苦労したので、忘備録として記録する。

## formオブジェクトのデータを取得したい
itemテーブルとmaterialテーブルがあったとする。
二つのテーブルを組み合わせて、`Item_material`クラスを定義した。

詳細ページにて、materialテーブルに保存したデータを表示するためにitemコントローラーに下記を記述した。
“`ruby
def show
@item = Item.find(params[:id])
@material = Material.find(params[:id])
end
“`
これではダメたった。material.idが@itemと同じidを取得してしまう。
例えばitem.idが4ならmaterial.idも同じ4になる。

## 成功したコード
“`ruby
def show
@item = Item.find(params[:id])
@material = @item.material
end
“`
これでいけた。この記述なら@it

元記事を表示

初心者向け enum の導入

既存のusersテーブルにenumを導入しようとしたら色々課題があったので記事にしました。
ユーザーの性別や年齢層をセレクトボックスで入力できる仕様にしたい。

– `devise`によりログイン機能が実装されている
– 以下のusersテーブル

| カラム名 | データ型 | 備考 |
|:-:|:-:|:-:|
| email | string | deviseにより導入済み |
| password | string | deviseにより導入済み |
| nickname | string | deviseに追加した |
| gender | integer | deviseに追加した |
| age | integer | deviseに追加した |

# enum の設定
Userモデルにenumの定義をしていく。
“`rb:models/user
class User < ApplicationRecord devise :database_authenticatable, :registerable, :rememberable, :v

元記事を表示

rails new で発生したエラーについて

### __bundlerによる不具合__
今回、railsの環境構築の際にハマりかけたエラーについて備忘録としてまとめておきたいと思います。

### __概要__
railsのインストール等が完了し、新規プロジェクト作成の際にrails newを行ったところエラーが発生。

主なエラー表記は下記の通りとなります。
“`
(defined?(@source) && @source) || Gem::Source::Installed.new
“`

調べてみると、bundleそのものの不具合のようでこの時に使用していたバージョンはBundler version 2.3.7でした。

なので、以下の手順でbundlerのバージョンアップを行い、再度新規プロジェクト作成したところ問題なく完了しました。

“`
#現在のbundleのバージョンを確認
$ bundle –version
Bundler version 2.3.7

#最新バージョンへアップグレード
$ gem install bundler
Fetching bundler-2.3.18.gem
Successf

元記事を表示

OTHERカテゴリの最新記事