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

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

未ログイン状態のユーザーを転送

今回は自分が最初よくわからなくて苦戦した部分です。

例を出すと、ログインしてない状態でも、「投稿する」ボタンの遷移先であるURLを直接入力すると、新規投稿ページにアクセスできてしまうという事。

一体どういうこと?って感じでした汗

わかりやすく言うと、URLに直接、新規投稿や編集のパスを入力すると遷移できてしまうと言うこと!
つまり、ログインもログアウトも関係なく誰でも出来てしまいます!

セキュリティみたいな物ですね^^;

そこで、今回は未ログインユーザーが投稿画面など直接アクセスしてきた際には、ルートパスに遷移するように設定を行います!

このような仕組みをリダイレクトと言い、例を出してcontroller.rbのすべてのアクションに対して、「もし、ユーザーがログインしていなかったらindexアクションにリダイレクトする」ような機能を実装をしてみます!

# 1.リダイレクトとは?

本来受け取ったパスとは別のパスへ転送する機能のことをリダイレクトと言います!
リダイレクトを利用すると、アクションに処理を持たせて実行した上で、そのパスのビューを返すのではなく別の意図したパ

元記事を表示

RailsのScaffoldを使って3分でwebアプリを作ってみる

Ruby on Railsのscaffoldを使って最速でwebアプリケーションを構築してみます。

#Scaffoldとは

まずはRuby on Railsのscaffoldとは何かについて解説します。

scaffoldとは、Railsに備わっているコマンドの1つで、ルーティングやコントローラー(controller)、ビュー(view)、モデル(model)とテーブル(データベース)の記述やファイルなどを自動で作成してくれるコマンドです。

本来、scaffoldは建築現場の足場やビルの窓を拭くときに使用される吊り足場を意味します。Ruby on Railsのscaffoldにおいても、アプリケーションの足場であるMVC(上記で紹介したModel-View-Controller)等を指し示し、それらを容易に自動生成できます。

つまり、scaffold を使用することで、コントローラーやモデルを作成する手間を省くことができます。

scaffoldを使って作成されるルーティングは、Railsが定める7つのアクションになります。(index・show・new・edit・creat

元記事を表示

【Ruby on Rails】Web APIの作り方を詳しく解説!

# はじめに
以前にこんな記事を投稿しました。
[【3分で出来る】Ruby on RailsでWeb APIの作成](https://qiita.com/ruemura3/items/4e99a968b18b49829301)

この記事で解説したように、Ruby on Railsは本当に優秀なフレームワークで、簡単なAPIだったら数分で作れちゃうんです。

しかし前回は3分で作ったAPIを実際に動かして試してみたというだけで、ソースコードの中身までは解説しませんでした。

今回はソースコードを見ながら、Ruby on Railsで作ったAPIが動く仕組みを見ていきます。

前回作成したAPIがある状態で解説を行うので、まだの方は上記リンクを見て作ってみてください。5つのコマンドを打つだけで終わります。

## 前提知識
– APIとは
– JSON
– HTTPリクエスト、レスポンス
– GET, POST, DELETE, etc…

## 環境
– ruby 2.6.5
– Rails 6.0.2
– macOS Catalina 10.15.3

# Rails APIの仕組み

元記事を表示

[Rails]Gemを使ってモーダル作成

# はじめに
本記事では、Gemを使ったモーダルの作成方法を記述します。

## 参考動画
ブックマークしているサイトがもろ見えになるので、上は切りました。
「決して」やましいものはありません。

![05adb4091ab2c978dffd22ddbd5045d2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1768158/8bcc6b41-7ff5-2a27-ae1e-b4c7ebb3a7b4.gif)

# 流れ

`gem`のインストールです。

“`ruby
gem ‘data-confirm-modal’
“`
からの

“`
bundle install
“`
からの

“`application.js
// = require data-confirm-modal
コメントアウトでOK
“`

“`erb
<%= link_to food_path(food.id), method: :delete, data: { confirm: '本当に削除しますか?削除すると

元記事を表示

知っておきたいincludesの正体【Rails】

rails 6.0.2
ruby 2.7.1

# includesとは

N+1問題を起こさないように、関連テーブルのデータをキャッシュしてくれるメソッド。
しかし、関連テーブルのデータをキャッシュするといっても
一体どのようにして、データを取得してきているのだろうか。

実はincludesは、モデルの関連など見て以下のどちらかの最適とrailsが判断したメソッドを実行している。
(このrailsの判断が正しいとは限らない。*後述)

preload|eager_load|
—|—|
|関連ごとにSQLを発行してキャッシュ。 |left_joinを用いて、キャッシュ。|

preload、eager_loadがどの様なSQLを発行してるか見ていく。

以下の様なモデルがあるとする。

“`ruby:user.rb
class User < ApplicationRecord belong_to :country #国 has_many :posts #投稿 end ``` ## preload preloadは、関連ごとにSQLを発行してキャッシュする。

元記事を表示

【Rails】同名のパスのviewで表示するインスタンスを使い分ける

rails初学者によるポートフォリオ作成中の学びのアウトプットです。

#実現したい事
クイズアプリを作成中に複数のモードを全てquestionモデルとanswerモデルで賄いたい(ジャンルAのクイズ集とジャンルBのクイズ集を実装する)。下記の二つのページのようにnew_answer_pathからアクセスした時に異なるジャンルの問題が表示されるようにしたい。

(モードA)

ジャンルAの問題を表示

回答欄(answerモデルに保存される)

(モードB)

ジャンルBの問題を表示

回答欄

#実装の流れ
①questionモデルにmode_numカラム(integer)を追加して問題のジャンルを番号で識別するようにする。

②new_answer_path(mode_num: <識別番号>)とし、newアクションにmode_numを渡すようにする。

③newアクションで渡された識別番号からquestionモデルを検索するよう実装する。

#実際のコード

(②のステップから)
問題ジャンルAはquestion.mode_numを1に設定。
問題ジャンルBはquestion.m

元記事を表示

Rails の Custom Validator を RSpec で柔軟かつ簡単にテストする方法

# はじめに
カスタムバリデータのテストを RSpec で記述するにあたり、いくつかの技術記事を参考にしたが、どれも一部情報が欠けているものばかりだった。

そこで、カスタムバリデータのテストの書き方について、個人的につまずいた部分を解消したものをまとめておく。

# 目標
以下のようなカスタムバリデータがあり、そのテストコードを RSpec で記述できるようにする。

“`ruby:app/validators/inclusion_in_array_validator.rb
# frozen_string_literal: true

# 配列の中身に特定の値が含まれている、または、特定の値の範囲内かを検証するカスタムバリデーション
class InclusionInArrayValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) return if value.all? { |v| options[:in].include?(v) } rec

元記事を表示

[Ruby] AtCoder過去問 B – Chocolate

##はじめに
AtCoderの過去問B問題をRubyで解いてみました。
よろしくお願いします。

問題はこちらから確認してください↓

https://atcoder.jp/contests/abc092/tasks/abc092_b

##B – Chocolate

まずは入力を受け取ります。
aは配列として受け取るようにしています。
答えはチョコの数なので変数chocoに0を代入しておきます。

“`Ruby
n = gets.to_i
d, x = gets.split.map(&:to_i)
a = readlines.map(&:to_i)

choco = 0
“`

まずは法則を考えます。
私は割り算でこの問題を考えました。

①まず、dをそれぞれの日数で割った時あまりなく、ちょうどで割り切れた場合はチョコを割った答えがチョコを食べた数です。
→この法則は入力例2の一人目や入力例3の最後のひと(6の人)に当てはめて計算してみたらわかります。

②もし、dをそれぞれの日数で割った時、あまりがある場合は割った答え+1がチョコを食べた数です。

③もし入力例1の3人目の人

元記事を表示

ActiveStorage と variant と それから N+1

## 概要と対策手順
1. `Active Storage`を使ってポートフォリオを作成
1. 作成後のレビューで`Active Storage`で`N+1`を確認する
1. 原因は`Active Storage`の`variant`だった
1. 現環境では対処できないのと発覚。
1. `variant`をやめて`CSS`での制御に変更し解決。

※ポートフォリオの詳細に関しては[こちら](https://qiita.com/ryo1103/items/973d05c52b2adb3e84b2)に投稿してあります。

## 実行環境
– Ruby ( 2.7.2 )
– Ruby on Rails ( 6.1.4.1 )
– PostgreSQL

## Active Storage と N+1
– 対象になったのはこちら(記事の投稿者を示すユーザーアイコン)
![スクリーンショット 2021-09-16 10.56.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748419/76965a2f-

元記事を表示

【RSpec】結合テストを実施した際に出たchromedriverに関するエラーの解消方法

#対象者

* chromedriverに関するエラーが発生している方
* RSpe結合テストを実施中の方
* JavaScriptのテストが不要な方
* GoogleChromeを使用中の方

#目的

* エラーを解消してRSpecテストを実行できるようにする

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

* RSpecテスト実装
* Ruby 2.6.3
* Rails 5.2.5
* Gemfileは下記の通り

““Gemfile.
:
:
group :test do
# Adds support for Capybara system testing and selenium driver
gem ‘capybara’, ‘>= 2.15’
gem ‘selenium-webdriver’
# Easy installation and use of chromedriver to run system tests with Chrome
gem ‘webdrivers’
gem ‘rspec-rails’
gem ‘factory_bot_

元記事を表示

[RSpec]コメント機能の単体テスト

# はじめに
本記事では、コメント機能の単体テストのコードや説明を記述します。

前回いいね機能について投稿しているので、こちらも参照ください。

https://qiita.com/mkato1013/items/3e36504e5f2648c91c88

## 前提
– コメント機能の実装ずみ
– 私は、投稿に対するコメントを実装しています。

# コード
早速ですが、コードを記述します。
初めの方のsleep 0.2は必要ありません。
自宅のWi-Fiがとんでもないぐらい遅いので記述しています。一応記事を添付します。

https://qiita.com/mkato1013/items/e7fd98978d90a0bad1a9

“`spec/models/comment_spec.rb
require ‘rails_helper’

RSpec.describe Comment, type: :model do
before do
user = FactoryBot.create(:user)
food = FactoryBot.create(:food

元記事を表示

deviseで作成したログインページのviewの編集が反映されない(メモ)

##事象詳細
devise導入後、Viewを編集して反映されていたのに何故か急に反映されなくなり、devise導入直後のようなレイアウトに戻ってしまった。


###試したこと
・rails server再起動
・`bundle install`
・DBのrollback、migrate
・PCの再起動

上記を何度繰り返しても改善されなかった


####ログを確認
`rails server`コマンドで立ち上げる際にターミナルのコマンドをよく見てみると、いつものrender先ではないことに気がついた

“`
Rendering layout /Users/*****/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/letter_opener_web-1.4.0/app/views/layouts/letter_opener_web/letters.html.erb
Rendering /Users/*****/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/letter_o

元記事を表示

[Ruby] デザインパターンの簡潔サンプルコード集

# 概要

Ruby によるデザインパターンの簡潔なサンプルコード集.

Web でデザインパターンの使用例を探しているときに、
「複雑な例での説明は要らない. それよりも簡単な例を提示してくれ.」
という思いが強かったので書き残す.

|コンテンツ|掲載時期|
|:–|:–|
|[[Ruby] 簡単例: Singleton(モジュール)](https://qiita.com/robozushi10/items/90b091bca458e5d7a6c5)|2021/09|
|[[Ruby] 簡単例: Singleton(オブジェクト)](https://qiita.com/robozushi10/items/ab5e439b40b32c9e935d)|2021/09|

元記事を表示

【Ruby】フォーマット文字列

rubyのフォーマット文字列をまとめておく。

“`
フォーマット文字列 意味
%y 西暦の下2桁(00-99)
%Y 西暦を表す数(9999)
%m 月を表す数字(01-12)
%M 分(00-59)
%d 日(01-31)
%D 日付(%m/%d/%y)
“`

%Y-%m-%d → 2021-09-09
これが一番よく使いそう。

元記事を表示

[Ruby] 簡単例: Singleton(モジュール)

|本シリーズのトップページ|
|:–|
|[[Ruby] デザインパターンの簡潔サンプルコード集](https://qiita.com/robozushi10/items/b4a43ead438317578ec9)|

# 概要

既存コードへの機能追加の際に Singleton を追加したときの記録.

Singleton の概念などは省略.
単に Ruby でどう書くかだけを書き残す.

## ファイル構成

・モジュール mod.rb で定義したデータを Singleton にする
・下記 user1.rb と user2.rb は mod.rb を include する

“`
.
|– mod.rb …. モジュール.
|– user1.rb .. 上記 mod.rb の使用者その1
`– user2.rb .. 上記 mod.rb の使用者その2
“`

## 実装

### mod.rb

「@a」を(同一プロセス上の) プログラム各所からアクセスできるようにする

“`ruby
module M
@a = ” # 保持したい値を持たせる

元記事を表示

スコアの平均点を出す方法!

◼️ スコアの平均点を出すにはどうしたらよいのか?
 
そんな時はaverage_scoreを使うとスコアの平均点を簡単に算出できる!

書き方: average_score = {・・・ + ・・・ + ・・・ }

上記の様に書けばOK!
・・・ の所には平均点を出すための各スコアを記述すれば良い:point_up:

今日の投稿は以上です。

wagaでした!

元記事を表示

VagrantでRuby on Railsの開発環境構築をしたメモ

# はじめに
– Railsをいじったことが少しありますが、改めて勉強し直したいと思い、Railsチュートリアルをやろうとするも、開発環境構築でかなり苦戦したので、自分用のリンクメモです。先人の皆様ありがとうございます‥!
– もっと良い方法など教えていただけると嬉しいです

# 環境
– macOS Catalina 10.15.7
– VirtualBox 6.1
– Vagrant 2.2.18
– Ubuntu 18.04
– Ruby 2.6.8
– Ruby on Rails 6.0.3
– rbenv 1.1.2-2-g4e92322

# 全体像
– この辺の図でやることのイメージがつきました。
– [VirtualBoxやVagrantを用いたRails開発環境の構築方法(前編)](https://thinkit.co.jp/story/2014/06/25/5072?nopaging=1)に載っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2026906

元記事を表示

Qiitaの書き方

# 簡単な記述から覚えていく!

まずは記事を書くことから覚えていく様にしたいと思います!
まだまだ使いこなせていないので、自分のアウトプット用な感じですが汗
初心者ならではの、わかりやすいように書いていきたいと思います!

#1,タイトルの記述

 #をつけて記述すると文字が大きくなり見出しになります!
下に例を書いてみます!
#タイトル
#タイトル 
注意点!! #は半角でないとダメです!

#2,コードの記述

コードの挿入は“`でコードを記述!
最初と最後に記述します!
注意点!! ` はバッククオート3つです。

例を書いてみます!

*例の為、全角で書いてあります!

``` ←半角
def destroy
eat = Eat.find(params[:id])
eat.destroy
redirect_to root_path
end
“`←これが正しい形

“`
def destroy
eat = Eat.find(params[:id])
eat.destroy
redirect_to root_path

元記事を表示

コントローラの使われ方がわかんない

MVCのことはちゃんと理解した方がいいから備忘録。

#1.コントローラとは
MVCモデルのC。ユーザーからのリクエストを受け取り、モデルを介してデータを授受したり、ビューを用いてHTML出力を生成するもの。
見方を変えると、コントローラはモデルとビューの仲介をしているとも取れる。モデルのデータをビューで使えるようにすることで、データをビューで表示したり、入力されたデータでモデルを更新したりする。

#2.コントローラの作り方
ターミナルにおいて下記のように入力して生成する。

“`ruby
% rails g controller (コントローラ名)
“`

コントローラの名前は複数形を使うことが一般となっている。
絶対ではないが遵守することで、既存のルーティングジェネレータがそのまま使えたり、名前付きのルーティングヘルパーの用法がアプリケーション全体で一貫する。

#3.メソッドとアクション
railsのコントローラは全てApplicationControllerを継承したRubyのクラスとなっている。例えば、SamplesControllerというコントローラがあったとして下

元記事を表示

[Ruby] AtCoder過去問 A – Candy Distribution Again

##はじめに
AtCoder過去問A問題をRubyで解いてみました。
よろしくお願いします。

問題はこちらから確認お願いします。↓

https://atcoder.jp/contests/agc027/tasks/agc027_a

##A – Candy Distribution Again

まずは入力を受け取ります。

“`ruby
n, x = gets.split.map(&:to_i)
a = gets.split.map(&:to_i).sort
“`

配列の中は昇順に並び替えてaに代入しています。

後ほど繰り返し処理を行なって、繰り返した回数が答えとなるため、変数countを用意して、0を代入します。

“`ruby
n, x = gets.split.map(&:to_i)
a = gets.split.map(&:to_i).sort

count = 0
“`

while文で繰り返し処理をしていきます。
条件は配列の中身がなくなるまで行うようにします。

“`ruby
n, x = gets.split.map(&:to_i)
a = get

元記事を表示

OTHERカテゴリの最新記事