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

Rails関連のことを調べてみた2020年12月28日
目次

active-adminで管理者の新規登録をできなくする

ブログはこちらです.

最近[active-admin](https://github.com/activeadmin/activeadmin)を使って管理画面を作ったりしてました.

ログイン画面を開くと管理者として新規登録ができてしまってとんでもないことになっていたので,できないようにする方法をメモっておきます.

## 管理者の新規登録をできなくする方法
active-adminではdeviseが使われていて,deviseの設定によってログイン画面の機能も変わってくるようです.

deviseの設定はmodelに書かれていますのでこれを変更します.

おそらく最初はこんな感じです.

“`
class AdminUser < ApplicationRecord devise :database_authenticatable, :re

元記事を表示

Rails hidden_field について調べる(確認画面を作成して挙動確認)

こちらもなんとなくで意味を理解している、具体的な使い方のイメージができていない
の理由からしらべて記事を書くことにしました

##「hidden_field」とは
form_forやform_withの中で使用する
目に見えない値を送るイメージ

どうやら、「hidden_field_tag」ヘルパーもあるみたいだが
これらの違いはまた別の日に記事にする

##とりあえず、手を動かして使ってみる、準備編
ユーザーが投稿する画面を作って
投稿するまえに**投稿の内容の確認画面**を作成してみる

UserとPostのそれぞれのコントローラーとモデルを
作成してみる

“`
~/environment/rails/sample_app
❯ rails g controller users

~/environment/rails/sample_app
❯ rails g model User

~/environment/rails/sample_app
❯ rails g controller posts index new create

~/environment/rails/s

元記事を表示

RailsのCurrentAttributesを使ってX-Request-IDでnginx(Webサーバ)とunicorn(アプリサーバ)のログを追えるようにする方法

# 動作確認したRailsのバージョン
6.0.3.4

# よくある話として
NginxなどのWebサーバのログとunicornやpumaなどのアプリサーバのログを同じIDで検索するため、X-Request-IDをアプリサーバのログに仕込んだりします。Railsに予め用意されているconfigの設定で行うのが手軽ですが、下記のような問題があります。

# TaggedLoggingの問題

TaggedLoggingを利用していれば、configファイルの以下の設定のコメントアウトを外せばX-Request-IDがログに付与されるようになっています。
`config.log_tags = [ :request_id ]`

X-Request-IDが123456789だとした時、↓のようなログになります。

“`console
[2020-11-XXT09:37:34+09:00] [123456789] some message
“`

しかし、TaggedLoggingは例えば下記のような処理がある時、backtraceをログに出力してくれません。

“`ruby
d

元記事を表示

dockerコンテナに、Could not find hoge in any of the sources Run `bundle install` to install missing gems.が出た場合の対処

bundle installをするたびに、dockeのrailsコンテナを再起動して見る

それでもうまくいかない場合、

“`docker:docker
docker-compose build –no-cache
“`

以下を実行します。
参考

## 最後に
僕のdockerfileが悪いのかもしれません。それとも、bundle installするたびにrails sする必要があるのかもしれません。

元記事を表示

[Rails&Docker&MySQLの環境構築] Could not find gem ‘mysql2 (>= 0.4.4, < 0.6.0)’ in any of the gem sources listed in your Gemfile.とエラーメッセージが出てきた。

#概要
初投稿です。

[こちらの動画](https://www.youtube.com/watch?v=Fq1PH0Gwi8I&t=1161s)を見ながら環境構築をしていた最中に
“`docker-compose build“`後
“`docker-compose up“` を実行したら

“`Could not find gem ‘mysql2 (>= 0.4.4, < 0.6.0)’ in any of the gem sources listed in your Gemfile.``` というエラーが出た。 #開発環境 macOS catalina バージョン10.15.7 #試したこと とりあえずググって * myslqの再インストール + ruby2.5.8から2.6.6へのアップデート + docker desktopの再設定 その他諸々のことを試したが色々試したが事象変わらず。 4時間経過。 朝日が登ってきて泣きそうになる。 #解決方法 ```docker-compose run web bundle install``` ```docker

元記事を表示

【Rails】楽天APIを用いた検索機能にvalidationを設定(楽天APIの実装から~)

###実装内容
楽天APIを用いて検索機能を実装すると、検索フォームが空白 or 1文字で検索すると**keyword is not valid**とエラーが出ます。
コントローラーの該当アクション内で文字数をカウントして条件分岐したり、入力フォームをJavascriptで制御すれば手っ取り早いですが、それでは文字数にしか制限をかけられません。
通常のmodelのようにvalidationを設定する処理を記事にしました。

###楽天商品検索APIについて
[楽天商品検索API]
(http://webservice.rakuten.co.jp/api/ichibaitemsearch/)

###楽天APIを使用した検索機能の実装
[筆者が参考にした記事を参考にしてみてください(他人任せですいません…)]
(https://freesworder.net/rakuten-api-rails/)
上記の記事の内容は、新しくアプリを作るところからになっていますが、皆さんの状況に合わせて参考にしてください。
筆者は既存のアプリの既存のコントローラー(searchs_controller

元記事を表示

Ruby on Rails でnewコマンドにてアプリを作成するとbundler: failed to load command: spring (/Users/ユーザー名/アプリを作成するディレクトリ名/アプリ名/vendor/bundle/ruby/2.6.0/bin/spring)と出た話

こんばんは。Miyayanと申します。今回初めてQiitaにて記事をあげます。
ゆえに拙い部分もあるかと存じますが、どうぞよろしくお願いいたします。

# 目次

– 環境
– 参考記事
– 概要
– 仮説
– 試したこと
– 解決方法
– まとめ

# 環境

**OS** : macOS Big Sur ver.11.1
**Ruby** : 2.6.5p114
**Rails** : 6.0.0
**bundler** : 2.1.4, default: 1.17.2
**gem** : 3.0.3

# 参考記事

・[【Rails6】rails new で bundler: failed to load command: spring が出た。問題はbundler2.1.4かRuby2.7にあるようだが…..](https://qiita.com/chabudai/items/4051c21ca9161a301bfb#%E7%99%BA%E7%94%9F%E3%81%97%E3%81%9F%E3%82%A8%E3%83%A9%E3%83%BC)

・[bundler

元記事を表示

FactoryBot、外部キーバリデーションで弾かれたときの解決方法

#はじめに
 以前から、FaxtoryBotを使って、Rspecのテストがエラーでなかなか進めませんでした。今回、解決出来たので紹介します。

↓以前の投稿
[FactoryBotで外部キーの値はどうやって作り出すんだ〜(泣](https://qiita.com/TerToEer_sho/items/02348a0fd017b1ea81bc)

##設計

userテーブルはroomテーブルとアソシエーションしていて、ユーザー登録をする際に、room_idを入力する必要があるような状況です。

##ユーザー登録のテストコード一部

“`ruby:user_spec.rb
RSpec.describe User, type: :model do
describe ‘ユーザー登録’ do
before do
@user = FactoryBot.build(:user)
end
it ‘全ての項目が入力されていれば、登録できること’ do
expect(@user).to be_valid
end
end
end
“`

元記事を表示

Railsチュートリアル 14章 FactoryBotでRelationshipのテストデータの作成

#はじめに
Railsチュートリアルをrspecに対応させながら取り組んでいたところ、14.2.3のリスト14.28のユーザのRelationshipテストデータをFactoryBotで作ろうとしたときにハマってしまったので、備忘録として投稿します。

#環境
– ruby 2.7.2
– rails 6.0.3
– factory_bot_rails 6.1.0
– rspec-rails 4.0.1

#やりたいこと
①下記ようにrelationshipのテストデータを作成するfixtureをFactoryBotで定義する。
②userのテストデータも同時にFactoryBotの定義内で作成する。

“`ruby:test/fixtures/relationships.yml(リスト14.28)
one:
follower: michael
followed: lana

two:
follower: michael
followed: malory

three:
follower: lana
followed: michael

four:
fol

元記事を表示

【Ruby】便利なやつだよ〜before_action編〜

コントローラー内の記述でかぶっているものについてまとめてくれる、そんな素晴らしいコマンド「before_action」編です。

“`
class ItemsController < ApplicationController def index @items = Item.order('created_at DESC') end def new @item = Item.new end def create @item = Item.new(item_params) if @item.save redirect_to root_path else render :new end end def show @item = Item.find(params[:id]) end def edit @item = Item.find(params[:id]) redirect_to root_path unless current_user.id

元記事を表示

ファイル生成を抑えた最低限のRails

#はじめに

新しくRailsでアプリを作ろうとした際に、余計なファイルが生成されてしまうのが気になったので、今回は自分に必要な最低限のファイル生成でrails newをする方法、設定を書きます。

#Rails newのオプション

rails newにオプションをつけることで、指定した関連のファイルを生成しないでアプリを作ってくれます。
以下によく使いそうなオプションをいくつか上げていきます。中にはファイル生成以外の物も含まれています。

## 使用データベースの指定

“`
rails new sample_app –database=mysql
“`

–database=(任意のDB)で最初から指定したDBでアプリを作ってくれます。指定しない場合はsqliteになるはずです。勿論DBは後から変更することはできますが、少々面倒なので使用DBが決まっている場合は先に指定してしまいましょう。

## minitestの除外

“`
rails new sample_app –skip-test
“`

rails標準搭載のminitestを生成しなくなります。Rspe

元記事を表示

クッキーとセッションの仕組み

## 概要
クッキーとセッションについて学習したので自分用メモとしてアウトプットしていきます。

## はじめに

ショッピングサイトで**ログイン情報を入力しなくてもログイン**できたり、**(自分が削除しない限り)カートに入れた商品がしばらくカートに入ったまま**になったりしますよね。これは、**セッション**と**クッキー**の仕組みがあるため実現できています。

## セッション(session)

– Webサービスに情報を一時的に保持してくれる仕組み
– アクセスの開始から終了までの一連の通信
– Railsでは`session`というオブジェクトにハッシュのような形で格納される

[こちらの記事がイメージしやすく参考になりました!](https://wa3.i-3-i.info/word1791.html)
## クッキー(cookie)

– **ブラウザが持っている**データを保存できる領域
– セッション情報(ID)を保存する場所
– 有効期限がある

[こちらの記事がイメージしやすく参考になりました!](https://wa3.i-3-i.info/word172

元記事を表示

hidden_field_tagの使い方

## はじめに
Railsアプリ作成時に`hidden_field_tag`を使ったので、その時の内容のメモ書きになります。
検索機能を使った時にパラメータが飛ばなかったので`hidden_field_tag`を使用し対応した時の内容になります^^

## 使用方法
`hidden_field`と`hidden_field_tag`は用途は似ているが使い方が違う。
`hidden_field`は`form_for`や`form_with`の中で使用するに対し、

`hidden_field_tag`は一つだけで使用でき`単体でパラメーターを渡したいとき`に使用する。
`form_for`内でも使用はできます。

## 作業内容
このように検索窓のソースがあります。

“`:app/views/texts/index.html.erb
<%= search_form_for @eq do |f| %>

<%= f.sear

元記事を表示

form_withのlocalとflashメッセージ

# ちょっと困ったこと
Railsでよくあるflashメッセージを出そうと頑張っていたが、flash.nowだけ出せない。。。

例えば、以下のようにSessionControllerで、ユーザログインを行うようなコードを書く。

“`
def create
@user = User.find_by(login_id: params[:session][:login_id])
if @user && @user.authenticate(params[:session][:password])
log_in(@user)
redirect_to @user, success: ‘ログインしました’
else
flash.now[:danger] = ‘ログインに失敗しました。’
render :new
end
end
“`

ログイン成功したとき、すなわち、redirect_toした後の「ログインしました」は出るんだけど、ログイン失敗した時、すなわち「ログインに失敗しました」が全く表示されないとい

元記事を表示

resources & resource

#resources
Ruby on Railsでルーティングを行う際に必ずと行っていいほど頻出である`resources`。
`resources`はモデルに対してアプリケーションにおける基本メソッド7つを自動的にルーティングしてくれます。

例えば`User`モデルに対して`resources`を使ってルーティングを記載した場合

“`ruby:config/routes.rb
Rails.application.routes.draw do
resources :users
end
“`
`$ rails routes`でルーティングを表示させると以下のようになります。

“`console
$ rails routes
Prefix Verb URI Pattern               Controller#Action
users GET /users(.:format) users#index

元記事を表示

Rails チュートリアル 第8章 備忘録

第8章の備忘録です。

##環境
Rails 6.0.3
Ruby 2.6.3

##目次
[1 セッションとcookies](#1-セッションとcookies)
[2 フラッシュメッセージ表示](#2-フラッシュメッセージ表示)
[3 ヘルパーメソッドを作成して利用するまでの流れ](#3-ヘルパーメソッドを作成して利用するまでの流れ)
[4 jqueryとbootstrapの導入方法](#4-jqueryとbootstrapの導入方法)
[5 signupした後に再度ログインさせない](#5-signupした後に再度ログインさせない)

##1 セッションとcookies
日頃通信する時に利用されている**HTTP**は**ステートレスなプロトコル**である。
そのステートレスとは、
ブラウザ側が、〇〇のページを表示してください(リクエスト)→サーバー側が、〇〇のページです!(レスポンス)のやりとりをトランザクションというのだが、一度そのやりとりを終えるとすっかり忘れてしまうのである。

つまり、会員サイトでログインした後に、この商品の購入ページを表示してくださいとリクエストを送

元記事を表示

scopeの中にjoins等は書いて構わないと思う

主観もりもりです。賛否両論あると思いますが、いろんな意見もらえると嬉しいです。

## 背景
こんなコードを見かけた。

“`rb
class Hoge
scope :with_active_fuga, -> { merge(Fuga.active) }
“`
これだとscope単体で動かない。joins(:fuga)等を付けてあげないといけない。
でも、このjoins(:fuga)等は,

* `joins(:fuga).with_active_fuga`のように処理の中に付ける方がいいの?
* それともscope外の呼び出し元にjoins(:fuga)等を付ける方がいいの?

と疑問に思ったので立ち止まって考えるに至った。

## scopeに書いて構わないと判断した理由

* joins等を外出しすると使う人にjoinの種類を委ねるからパフォーマンスや動作的にscope設計者の意図しない使われ方をされるリスクがある。
* joins等を外出し前提で作ると、単純に動かないコードをそのまま残すことになってまずい。
* `joins(:fuga).joins(:fuga)`のよ

元記事を表示

RailsチュートリアルでRuby3.0.0をインストールしたらbundle updateとbundle installができなかったときの解決法

##あいさつ
知っている人はこんにちは!知らない人ははじめまして!
独学でプログラミングを極める変態中学生のAtieです!
今回は約3日間格闘し続けたエラーの解決法がわかったのでここに記録を残します
これでやっとRailsチュートリアルを進めることができます

###結論から言うと…
**Rubyの最新版(3.0.0)をインストールしてしまって依存関係が解決できずに動かなかった!**
ということのせいで動きませんでした
なのでRailsチュートリアルと同じバージョンのRuby2.6.3をインストールしてGlobalに2.6.3を設定することで動きました!
##開発環境
Ruby 3.0.0
Rails 6.0.3.4
Gemfile.lock は削除済み
Gemfileの内容(名前は「Gemfile」ですがRubyのコードで記載されていてわかりやすいようにわざと.rbの拡張子をつけています本番環境では.rbはついていません以下Gemfileを表示するときは.rbを拡張子としてつけています)

“`Gemfile.rb
source ‘https://rubygems.org’
g

元記事を表示

FactoryBotでの外部参照キーの記述方法

# はじめに
Railsでテストコードを記述していたところ、必要事項を全て埋めても、外部参照したカラムの記述に関するエラーが出たので、FactoryBotでの外部参照キーの記述方法についてまとめました。

# 前提条件
下記のER図のようなUserモデルとArticleモデルにおいて、Articleモデルのuser_idが外部参照している場合を考えます。また、下記のようにUserのFactoryBotは定義済みとします。
![ER.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829213/9df245a2-4865-1657-2791-8957c3bc44cc.png)

“`ruby:user.rb
# UserのFactoryBot
FactoryBot.define do
factory :user do
nickname {Faker::Name.name}
email {Faker::Internet.ema

元記事を表示

[Rails] WindowsのWSL2(Ubuntu、VSCode)にRailsをローカルインストールしてgitコマンドでgithub(master)にpushする

## 背景
WindowsのWSL2上でRails2.7.2を動かし、ブラウザでRailsが動いていることを確認し、コンソールからgitコマンドでgithubのmasterブランチにコードをpushするまでの手順です。

WSLを使った理由は、MACでの環境構築方法と近いからです。
また、gitでのブランチの切り分けとプルリク方法、Railsのフォルダ構成を最後に載せています。

## WSL 2(Windows Subsystem for Linux 2)をVSCodeから使えるようにする
① コントロールパネルから「プログラム」>「プログラムと機能」>「Windows の機能の有効化または無効化」を選択する。
表示されたチェックボックスにて「Linux 用 Windows サブシステム」「仮想マシンプラットフォーム」の二つにチェックを付ける。その後再起動を要求されるので再起動する。

② Windows storeからubuntuをインストールする。

③ 下記コマンドでWSLのバージョンを確認する。

“`
$ wsl -l -v
NAME STATE

元記事を表示

OTHERカテゴリの最新記事