Ruby関連のことを調べてみた2021年09月08日

Ruby関連のことを調べてみた2021年09月08日
目次

コントローラー内の処理のカテゴリー

#####自分でもあやふな部分があるので復習も兼ねて!

###まずコントローラーとは?

・リクエストに対する処理をする場所
・処理をした後クライアントにレスポンスとして返す場所

###コントローラー内での処理のカテゴリー

・コントローラー内での処理のカテゴリーをアクションと言います!
 基本的な7つのアクションが、、、
 
・index→一覧表示(トップページ)
・new→新規投稿ページ
・create→データの投稿
・show→個別詳細ページ
・edit→投稿編集ページ
・update→データの編集
・destroy→データの削除

例えば、クライアントからトップページが見たああああああい!!とリクエストが来た場合はコントローラー内のindexアクションが動きます!

トップページの表示がリクエストで来ていた場合の記述の仕方↓

“`rb
def index
end
“`

以上!!

                         

元記事を表示

ActiveStorageにバリデーションを設定する方法

## はじめに

Ruby on Railsにおいて、ActiveStrageは画像投稿機能を実装する際、
とてもシンプルで使いやすく、重宝しています。
ただ、**バリデーション**の設定が**デフォルトでできない**ようです。
どうにかしてバリデーションの設定ができないか調べてみると、
オリジナルでファイルを作成している方々がたくさんいらっしゃり、
尊敬と憧れを抱きつつも、ズボラな自分はもっと簡単に設定する方法ないの?
と探してたどり着いた方法です。

それは`activestorage-validator`という`gem`を導入する方法です。

個人的に、普通にモデルに設定するバリデーションとほぼ同じやり方で設定できる点が使いやすいなと感じ、他の初学者の方にもオススメできると思い記事にした次第です。

導入から使い方を下記にまとめて見ました。

(今回は`Rails 6.0` 、`MySQL`を使用しています。)

## 導入方法

まず、`Gemfile`に下記を記述します。

“`ruby
gem ‘activestorage-validator’
“`
コンソールで

`

元記事を表示

【Ruby on Rails】バリデーションが効かなかったときの原因追求をした話

#対象者

* バリデーションを使っている方
* バリデーションが効かない不具合が発生している方

#目的

* バリデーションを使って投稿が失敗するようにすること

#実際の手順と実例
###1.前提

https://post-output.com/185/

上記記事を参考に実装

* Articleモデル(記事の投稿)、Tagモデル、ArticleTagモデル(中間テーブル)実装中
* title,bodyはArticleのカラム、tag_nameはTagのカラム

 下記のようにバリデーションを設定したが投稿ができてしまう、、、

““model/tag.rb
class Tag < ApplicationRecord has_many :articles, through: :article_tags has_many :article_tags validates :tag_name, presence: true end ``` ###2.結論(解決策) 下記のようにコントローラーを変更 before ```app/tags_control

元記事を表示

[Ajax]フォロー機能を非同期にした

# はじめに
本記事では、フォロー機能を非同期通信にした方法を記述します。

以前にいいね機能について、非同期通信にした記事も投稿しておりますので、
ご参照ください。

https://qiita.com/mkato1013/items/9ee39a7675371aa585ce

## 前提
フォロー機能が同期通信できているものとします。

# コード
早速ですが、該当箇所のコードを記載します。

## コントローラー
showページにフォローボタンやフォロワーを確認できるボタンがあります。
後述のモデルに合わせて`followings`や“followers`メソッドを作成します。

また、`users`と`followers`などに分けている方もいらっしゃいましたが、
私は、`followings`や“followers`に分けた方がわかりやすいと思ったため、こうしています。

“`users_controller.rb
class UsersController < ApplicationController def show @user = User.fin

元記事を表示

Fakerを利用したダミーモデルの作り方

# Fakerとは
ダミーデータを生成してくれるgem。
様々な種類が用意されている。

# seeds.rbとは
テーブルにデータを作成するファイル。ここにダミーデータを生成するコードを書く

# 導入方法
Gemfileに以下を記述してbundle install

“`ruby@:Gemfile
gem ‘faker’
“`
“`zsh
$ bundle install
“`

例えばusersテーブルに10件、Boardテーブルに20件のダミーデータを追加したい場合。

“`ruby:app/db/seeds.rb
10.times do
User.create!(
last_name: Faker::Name.unique.last_name,
first_name: Faker::Name.unique.first_name,
email: Faker::Internet.unique.email,
password: “12345678”,
password_confirmation: “12345678”
)
e

元記事を表示

9.7振り返り

js呼び出す時にcreateでredirect_to入れて呼び出せなくなった

“`ruby:
def new
@calender = Calender.new
end

def create
@calender = Calender.new(calender_params)
@calender.patient_id = current_patient.id
@calender.save

#jsの時は↓入れると読み込まれなくなる
# if @calender.save
# redirect_to patient_calenders_path
# else
# render :index
# end
end

“`

$(‘ここの指定が違う’)

“`js:apprication.js
$(function () {

↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ここに違うもの入れてエラーになって表示できない
$(‘#calendar_test

元記事を表示

末尾の文字列を3回出力するプログラムの作成

Ruby問題集から。
sliceメソッドを使って作成するのですが、今回ピックアップしたいのは模範解答にあるlengthメソッドについての所感というか愚痴というか私の知識不足の露呈というかをつらつら書いていきます。
まずは構成から。

問題
以下の要件を満たすextra_endメソッドを実装しましょう。

・対象の文字列から末尾にある2文字を取得すること
・取得した2文字を3回繰り返して出力すること

【ヒント】

“`ruby:qiita.rb
# 配列を作成します
array = [0,1,2,3,4,5,6]

# 配列から引数で指定した要素を取得します
ele1 = array.slice(1)
puts ele1
#=> 1

# 配列番号-4から4つ分の要素をsliceします
ele2 = array.slice(-4,4)
puts ele2
#=> 3, 4, 5, 6

# 配列はもとのままです
puts array
#=> [0,1,2,3,4,5,6]

“`

この段階で末尾の文字列 = ヒントに記載されている3つ目の’配列番号-4から〜’あたりを使用する

元記事を表示

送信中の暗号化をtrueにしたredisにsidekiqから接続する

## 前提
sidekiqを導入するにあたり、privateネットワーク内ではあるがアプリとredis間の通信を暗号化しようとなった。
それにあたりredisへの接続ができない問題に当たったのでその修正を覚書

※ redisにはElastiCache for redisを利用

## 結果

以下のように設定した上で以下を環境変数から注入

“`
REDIS_URL=rediss://aaa.aaa.aaa.0000.apne1.cache.amazonaws.com:6379
REDIS_AUTH_TOKEN=****
“`

“`rb
# config/initializers/sidekiq.rb
Sidekiq.configure_client do |config|
config.redis = {
url: ENV.fetch(“REDIS_URL”) { “redis://127.0.0.1:6379” },
password: ENV.fetch(“REDIS_AUTH_TOKEN”) { nil },
}
end

Sidekiq.co

元記事を表示

No route matches [GET] “/logout”の解決

誤り等ありましたらご指摘ください
##前提
-Rails 6.1.4
-ruby 2.6.8

##問題

rails tutorial 8章を学習中、ログアウト機能を追加したので試してみた所、下記エラーが発生。

“`
No route matches [GET] “/logout”
“`
調べても「jQueryがない!」と言った記事が多く、チュートリアルでは過程でインストールしている為、解決の糸口は見つからず、丸二日悩みに悩んで見つけたのが、”link_to”を”button_to”に置き換える事だった。

“`ruby:_header.html.rb
<%= link_to "Log out", logout_path, method: :delete %>
“`

“`ruby:_header.html.rb
<%= button_to "Log out", logout_path, method: :delete %>
“`

しかしこれではデザインが崩れてしまい、私の意に反する。

##解決
これを

“`ruby:app/javascript/packs/

元記事を表示

【Rails】includesメソッドと部分テンプレートを繰り返しrenderにする事によってN+1問題を回避する

# N+1問題とは?
SQLが必要以上に実行されてしまいパフォーマンスが落ちる問題のことです。
それぞれのモデルに

“`ruby
(Userモデル) has_many :boards
(Boardモデル)belongs_to :user
“`
といった定義を施すことで、関係性を定義することができます。

N+1問題はアソシエーション有りの時に生じる問題であり、上記の例で言うと掲示板の一覧を表示する際にユーザーの名前を取得するために掲示板の数だけSQLが発行されてしまいます。

具体的には次のようなコードになります。

“`ruby:app/controllers/boards_controller.rb
class BoardsControllere < ApplicationController def index @boards = Board.all end end ``` ```ruby:app/views/boards/index.html.erb <% @boards.each do |board| %>
<%= render partial:

元記事を表示

本番環境にてGmailを送信する【Rails】

#本日の内容
今回の記事のですが、本番環境(EC2)にてGmailを送る実装になります。
`開発環境でも参考になると思います!(記述する場所を変えるぐらいなので)`

#環境・前提
ruby 2.6.5
本番環境EC2

#◇Gmailメール実装
こちらでは、本番環境にてgmailからユーザーにメールを送っていきます。

###流れ
①Gmailアカウント/アプリパスワード取得
②コードに記述

###Gmailアカウント/アプリパスワード取得
gmailのアカウントのアプリパスワードが必要です。(通常のログインパスワードだとエラーが出ます)
今回は、gmailアカウントの2段階認証をオンにして、アプリパスワードを取得ます。

**① 送信用に利用するgmailのアカウントで [ログイン](https://myaccount.google.com/?utm_source=OGB&tab=mk&utm_medium=act&gar=1)**
**② [セキュリティ]設定**
 画面左のメニューから[セキュリティ]を選択し、セキュリティの設定画面を開きます。
![gmail1.png](h

元記事を表示

最初のGemfileの作り方

テキストコピペでもいいんですが、`npm init` 的な事できないのかなと思い調べました。
`bundle init` で `Gemfile` を生成できました。

参考
https://bundler.io/gemfile.html

元記事を表示

【RSpec】KeyError: Factory not registered:を解決した方法

#対象者

* RSpecテストを実施した際にKeyError: Factory not registered:というエラーが出ている方

#目的

* 上記エラーを解消して、テストを正常に作動させる

#実際の手順と実例
###1.結論(解決策)

aliasを用いて、「spec/factories/user.rb」内のuserに「,aliases: [:follower,:followed] 」と追加して解決

###2.エラー内容と前提

フォロー機能のテスト実行時に出たエラーが下記の通り

![スクリーンショット 2021-09-06 14.25.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/c4081f24-fc70-1ecd-d57a-671d9a0d2f00.png)

Factoryに”followed”が登録されていないと予想

下記

“`model/relationship.rb
class Relationship < ApplicationReco

元記事を表示

method(メソッド)について

・復習+学習始めたての方に

method(メソッド)とは?

プログラミングにおける処理をまとめたもののこと

定義の仕方

“`rb
def say_hello
puts “Hello”  メソッドの定義の部分
end

say_hello    メソッドの実行
“`

実行結果 Hello と出ます!

初投稿なので、簡単なのを簡単にまとめてみました。
これからどんどん分かりやすく楽しみめるような投稿していきます!

元記事を表示

Rails6 画像のプレビュー機能 + バリデーション失敗時での画像表示

#実装内容
**carrierwave**を使用して**画像アップロード機能**を実装し、**「よし!これで画像の投稿機能の完成だ!!」**と思っていたのですが、何か物足りなさを感じて画像投稿機能に関する記事をいろいろと調べていた所、**プレビュー機能**というワクワク機能に出会ったので今回はその紹介 + **バリデーション失敗時でも画像を表示する方法**も紹介しております。

#処理全体の流れ

1. プレビュー機能の実装
1. バリデーション失敗時の画像表示方法

#完成形はこちら

###プレビュー機能

[![Image from Gyazo](https://i.gyazo.com/223cb0d9f1dafabacf2edb961fbb1116.gif)](https://gyazo.com/223cb0d9f1dafabacf2edb961fbb1116)

###バリデーション失敗時

[![Image from Gyazo](https://i.gyazo.com/f27a90a1c130d3f0e6c6b14c5e302509.gif)](https://gyazo

元記事を表示

Ruby でヒアドキュメント内で条件分岐やループ処理を行う方法

# はじめに
複数行に渡る文字列を生成したいとき、ヒアドキュメントは便利だが、ヒアドキュメント内で条件分岐やループ処理を行う際に少し苦労したのでまとめておく。

# 実装方法
例として、以下のような仕様のコマンドラインスクリプトを実装してみる。

* マークダウンで記述されるブログ記事に、自動で YAML ヘッダをつける機能を持つ
* 引数としてタイトルやサムネイル画像、タグを与えると、`@options` 変数で各引数の値を取得できる

その際の、YAML ヘッダをヒアドキュメントで記述する。

“`ruby
require ‘erb’

header = <<~'HEADER' --- layout: post title: "<%= @options[:title] %>”
image: “<%= @options[:image] %>”
date: “<%= Time.now.strftime('%Y-%m-%d') %>”
tags:
<%- @options[:tags]&.each do |tag| -%>
– <%= tag %>

元記事を表示

[Ruby]Integer#downto

##はじめに
最近コメントいただいた中で新しいメソッドを教えて頂いたので忘れないうちに記事にしておきます。

##Integer#downto

integer型の数字に使えます。
使用した数字から1ずつ減らした数を一つずつブロック変数に入れて繰り返し処理をします。

引数にどこまで減らすか、最小の数字を渡すことで、最小値を指定できます。

“`ruby
6.downto(0) do |i|
print i
end
=> 6543210

6.downto(1) do |i|
print i
end
=>654321

6.downto(3) do |i|
print i
end
=>6543
“`

参考記事では下記のような使い方もしていました。
そのまま引用します↓

“`ruby
5.downto(1) {|i| print i, ” ” } # => 5 4 3 2 1
“`

参考: https://docs.ruby-lang.org/ja/latest/method/Integer/i/downto.html

元記事を表示

Ruby クラスとインスタンスと初期化について

#クラスとインスタンスとは
***クラス***とは設計書みたいなものです。
***インスタンス***とは設計書を下に作られたものです。

⚫︎具体的に説明すると
クラスを野球のグローブだとします。
インスタンスが赤いグローブ、黒いグローブ、黄色いグローブ
とします。
これはグローブという設計図(クラス)から
いろいろな色のグローブ(インスタンス)を作るということです。

#クラスについて
今回は野球のグローブをクラスとして扱っていきます。

“`rb

class Glove

end

#Gloveクラスのインスタンス作成
Glove.new

“`
ちなみに***クラス名の最初の文字は大文字(CamelCase)***です。

メソッドを入れると

“`rb

class Glove #クラスを定義
def player
pitcher = “ピッチャー”
puts pitcher
end
end

#Gloveクラスのインスタンス作成
glove = Glove.new
glove.player

元記事を表示

二桁以上の整数を入力すると、十の位と一の位の数字の足し算、十の位と一の位の数字の掛け算をそれぞれ行い、最後に2つの結果を足し合わせて出力するプログラムの作成

初投稿。

とある日に遭遇したRuby問題。
ポイントは整数の十の位・一の位を個別の整数として出力するメソッドを理解すること。特に十の位!
模範解答だけではイマイチしっくり来なかったため、解答コードを元に解説を備忘録として。

〜今回はヒントがありました。〜
「入力された2桁以上の整数を10で割った計算結果の余りが1の位、整数を10で割ったものを更に10で割った計算結果の余りが10の位となります。」
現代文の問題かのようなヒントが記載されていましたが、要は’%’を使いなさいということですね。

“`rb
def addition(a, b)
a + b
end

def multiplication(a,b)
a * b
end

def slice_num(num)
# 10の位
tens_place = (num / 10) % 10
# 1の位
ones_place = num % 10
return tens_place, ones_place
end

puts “二桁の整数を入力してください”
input = gets.to_i
X, Y =

元記事を表示

【Mac】Docker+rails6+postgreSQLでの環境構築完全版

環境

MacOS Big Sur 11.5.2
ruby 3.0.2
rails 6.1.4
Docker 20.10.8
postgreSQL 13.4
ディレクトリ myapp
全て現時点(2021/09/06)での最新バージョンです。

1.用意するファイル

・Dockerfile
・Gemfile
・Gemfile.lock
・entrypoint.sh
・docker-compose.yml

“`docker:Dockerfile
FROM ruby:3.0.2
# yarnパッケージ管理ツールをインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add – && \
echo “deb https://dl.yarnpkg.com/debian/ stable main” | tee /etc/apt/sou

元記事を表示

OTHERカテゴリの最新記事