Rails関連のことを調べてみた2021年01月23日

Rails関連のことを調べてみた2021年01月23日
目次

Ruby on Railsでアプリを作ってみよう③

##コントローラー
MVCの役割の一つ
ルーティングから振り分けられたリクエストを処理してレスポンスとして返す役割
必要なデータがあればビューやモデルとやりとりして取得して返します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/51fe185e-6ae4-37e5-ad15-17e8b5169d50.png)

ここでコントローラーの役割の一部にフォーカスしてみていきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/0eeb8cf7-02ae-eda0-d5b2-c67369683507.png)

コントローラーを作っていきましょう。

##rails g コマンド
railsで追加したいファイルなどを作るコマンドです。
ファイルの種類と作るファイル名を入力して使います。

“`
rails g ファイルの種類 作るファイル名
“`
さて、

元記事を表示

routeを設定する際にpathを使えば任意のパスを作れる

## 実装したクラス名とは異なるパスをつけたい
 例えば、hoge_controllerを実装していたが、パスだけhuga/indexにしたい時があったとする。
 こんな時、コントローラー名を変えて、クラス名をいろいろ変えて、、などとする必要はない。routes.rbの設定で何とかなる。(ただし、ファイルの管理はややこしくなってしまうかもしれない。。)

## パスだけを任意の形にしたいならpathを使う
### 例
“`
resources :クラス名, path: 実現したいパス do
collection do
get :メソッド
end
end
“`

## もっとカスタムしたい場合は以下を参照

[rails5]routes.rbでprefix・URI・controller#actionの値を任意にカスタマイズできる
https://qiita.com/og3/items/d814bf1a81cce2af633a

元記事を表示

form_withを使って、ユーザーが新規作成される仕組みを理解する

webサービスで新規登録やユーザログインのときに使われる、form_withというヘルパーメソッド。

Railsチュートリアルなどで突然登場して、なんとなく使い方が分かってるけど説明はできない「曖昧状態」になっていませんか。

ぼくもまさにそのひとり。

今回は、form_withを使って、ユーザーが新規作成される仕組みを理解する記事を書いていこうと思います!

## そもそも「フォーム」とは?

>
* nameとvalueがペアになってサーバに送られる
>
* nameとvalueはinputやselectやradioなどに付与される
>
* action属性に指定されたURLに対して入力値が送られる

引用記事:
[https://qiita.com/DaichiSaito/items/cd66115569b0a75f1bfa#11-%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%A8%E3%81%AF%E3%81%8C%E6%9B%96%E6%98%A7]

この3つをはじめてみたとき???と

元記事を表示

【Rails Tutorial】第1章 ゼロからデプロイまで

# はじめに
Railsチュートリアルをはじめるにあたり、演習の回答やエラーに対する解決方法、解決に至った経緯などを記録しています。
# 演習
## 1.3.2 rails server
###1.3.2 – 1
>デフォルトのRailsページに表示されているものと比べて、今の自分のコンピュータにあるRubyのバージョンはいくつになっていますか? コマンドラインでruby -vを実行することで簡単に確認できます。

“`:デフォルトのRailsページ
Ruby version: ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
“`
“`:自分のコンピュータにあるバージョン
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
“`

###1.3.2 – 2
>同様にして、Railsのバージョンも調べてみましょう。調べたバージョンはリスト 1.2でインストールしたバージョンと一致しているでしょうか?

“`:デフォルトのRailsページ
Rails v

元記事を表示

gem gretelの使い方 ~パンくずリストを作ってみよう~

“`
gem ‘gretel’
“`

このgemを使って、パンくずリストを作っていこうと思います。

## パンくずリストってなんぞや??

[![Image from Gyazo](https://i.gyazo.com/2cb4c1458d4b87e1e59f348414166c3e.png)](https://gyazo.com/2cb4c1458d4b87e1e59f348414166c3e)

ホームページのすみっこで見られる、ページの階層ですね。Webサイト内で、どの位置にいるのかがわかる機能です。

「ユーザー」を押すとユーザーページへ、「ホーム」を押すと最初のページへ飛ぶことができます。(ハンバーガーメニューとかパンくずリストとか、プログラミングの世界は、遊び心があって良いですよね。)

## gem ‘gretel’を使う

こちらのGithubのREADMEをご覧ください↓↓

[https://github.com/kzkn/gretel:embed:cite]

gem ‘gretel’をbundle installしたあと、

“`
$ rail

元記事を表示

Railsのルーティングについて学び直そうと思う…②

#はじめに
昨日に引き続き、Railsのルーティングについて、基本的なことから復習しています。

[Railsのルーティングについて学び直そうと思う…①
](https://qiita.com/TerToEer_sho/items/82cf422ac2b270001722)

##基本形

`HTTPリクエスト URL, to: ‘コントローラ名#アクション名’ `
**※省略形もあります**

HTTPリクエストとは、getやpostなど。
##ルール
– 読み込まれる順番は、上から。
→つまり、より限定的なURL程、上に記述しないと、予期しないところでマッチしてしまう。
ex)
「りんご」で、一致させたいのに、「くだもの」で一致してしまうみたいな…
…より、わかりにくくなったらすみません。

“`ruby

get “posts/:id” => “posts#show”
get “posts/new” => “posts#new”
“`

– :idは似たURLの中でも最後に書く。`:id`は変数なので、何にでも一致してしまう。

元記事を表示

【Rails】1対1のアソシエーションにおけるネストされたリソース設計について

## はじめに

リソース設計を考えるときに悩んだ結果をまとめました。
コード例はRailsです。

### 忙しい人のための要約

“`
PUT questions/:id/answer
“`

でupsertする。

## DB構造

![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322882/51b02f6a-5322-4bf5-5e3f-82f9072fec82.png)

questionsテーブルとanswerテーブルが1対1の関係です。
answerがquestionに紐づくので、外部キーはanswersに持たせます。

## モデル

“`rb:question.rb
class Question < ApplicationRecord has_one :answer, dependent: :destroy end ``` ```rb:answer.rb class Answer < ApplicationRecord bel

元記事を表示

Railsの検索メソッドの基礎(whereでLIKE句を使う)

### めちゃくちゃ曖昧に理解していたこんな文

検索用メソッドで出てくるこんな文。めちゃくちゃ曖昧に理解していたので、復習します。

“`Ruby:
@users = User.where(‘name LIKE ?’, “%#{params[:name]}%”)
“`

`(‘name LIKE ?’, “%#{params[:name]}%”)`はどういう意味かというと…(ちゃんと[Railsガイド](https://railsguides.jp/active_record_querying.html#%E9%85%8D%E5%88%97%E3%81%A7%E8%A1%A8%E3%81%95%E3%82%8C%E3%81%9F%E6%9D%A1%E4%BB%B6)に書いてあった)

検索に使う語句が**可変である**時の書き方らしい。
第一引数(`name LIKE ?`)の`?`の部分が、第二引数(`%#{params[:name]}%`)と置き換えられる。

そして、`where`では、上と下の書き方は同じ結果が得られる。

“`Ruby:
@users = User

元記事を表示

【Rails】scopeの定義とProcオブジェクト

## scopeとは
よく利用する検索条件に名前をつけてひとまとめにしたもの。
railsガイドでは以下のように解説されています。

> スコープを設定することで、関連オブジェクトやモデルへのメソッド呼び出しとして参照される、よく使用されるクエリを指定することができます。スコープでは、where、joins、includesなど、これまでに登場したすべてのメソッドを使用できます。どのスコープメソッドも、常にActiveRecord::Relationオブジェクトを返します。このオブジェクトに対して、別のスコープを含む他のメソッド呼び出しを行なうこともできます。

## scopeの書き方

“`ruby:models/book.rb
class Book < ApplicationRecord scope :costly, -> { where(“price > ?”, 3000) }
end
“`
scopeの第一引数にメソッド名、第二引数にProcオブジェクト(のラムダ)を定義することで、コントローラーやモデルでBook.costlyと書いたとき、

元記事を表示

続きを読む(truncate)の実装

##環境
・rails 5.2.4

##続きを読むの実装
snsでよくある続きを読むの実装の紹介をさせて頂きます。。

とっても簡単で以下のように末尾にtruncateと書くだけです。

“`php:images/index.html.erb
<%= image.introduction.truncate(20) %>
“`
20文字以上で…で表示されるという意味です。

この記述をすれば、以下のような表示になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008940/a8b867a5-c94e-d4d5-d554-be66a7a14243.png)

ちなみに、続きを読むのリンクは以下の記述で実装できました。

“`php:images/index.html.erb

<%= image.body.truncate(20) %>
<% if image.body.size >= 20 %>
<%= link_to image_path(image

元記事を表示

Rails gem ‘devise’でログアウトをコントローラから一発で呼ぶ方法

#Rails gem ‘devise’でログアウトをコントローラから一発で呼ぶ方法
今日はrailsのコントローラで一発でログアウトさせるということで記事をかいきます!

結論としては
reset_session
これをコントローラーないに記述するだけでした笑

今回なぜこれを使ったのかと言いますと
現在ユーザ退会機能を作っておりまして、その退会処理の後にログアウトさせる
必要があったために使いました:relaxed:

これ便利なメソッドなので是非皆さんも使ってみてくださいね!!

元記事を表示

BASIC認証とは

自分の備忘録用

Basic認証とは

ベーシック認証(Basic認証)とはWebサイトの特定の領域、つまりページやファイルにアクセス制限をかけることができる認証方法の1つ。ベーシック認証をかけると、認証をかけたWebサイトにアクセスしようとしたとき、下の画像のような認証ダイアログが立ち上がって、ユーザー名(ID)とパスワードの入力が求められる。

設定方法

まずトップページのコントローラーに before_action :basic_authを定義する。

「basic_auth」は変数名なので名前はこれじゃなくてもいい。

“`ruby
class アプリ名Controller < ActionController::Base before_action :basic_auth private def basic_auth authenticate_or_request_with_http_basic do |username, password| username == 'ユーザー名' && passw

元記事を表示

flashメッセージ

##flashとは
paramsと似たような存在。
ハッシュなので、キーを指定しなければならない。
paramsと違い、画面遷移を1回までは、データを保持したままにしてくれる。

##制作物

以下のコードからは、bootstrapを前提としているが、レイアウトを気にしなければ参考になるはず。

<%= yield %>の上にflash用のdivを用意する。
flash[:info]における、[:info]はキーにあたる。
flash[:oshirase]と定義しても問題ない。

“`erb:application/html/erb

<%=flash[:error]%>
<%=flash[:info]%>
元記事を表示

【Rails】seedとFakerでランダムなサンプルデータを作成

#はじめに
データベースに予め大量のデータを入れておきたいとき手動では大変です。
この記事ではseedとFakerを使って、自動でランダムなサンプルデータを作成する方法を紹介します。

####seedについて
seedファイルは、データベースにあらかじめ入れておきたいデータを定義しておくものです。
データをあらかじめ定義し`rails db:migrate`することで、簡単にDBへデータを投入できます。

####gem ‘faker’について
Fakerとはランダムな値を入れられるgemです。
 Gemfileの中にgem ‘faker’を追記し、 bundle installコマンドを実行することで使用出来る様になります。

詳しくは下記の公式ページを参照してください。
【公式】
https://github.com/faker-ruby/faker

#開発環境
ruby 2.6.5
Rails 6.0.3.4
faker 2.15.1
gimei 0.5.1

#fakerインストール

“`:Gimile
gem ‘faker’
gem ‘gimei’
“`
`

元記事を表示

単体テストエラー 〜ActiveRecord::StatementInvalid: Mysql2::Error::ConnectionError: Lost connection to MySQL server during query〜

自分の備忘録として残しておきます

エラー内容

ActiveRecord::StatementInvalid:
Mysql2::Error::ConnectionError: Lost connection to MySQL server during query

![スクリーンショット 2021-01-22 12.27.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614674/4cbe7797-610d-211c-d843-343e8da50f59.png)

スクショを見る限り一つ目のテストは成功してるのに二つ目以降のテストは失敗している、、、なぜ?
可能性としてはテストに負荷がかかりすぎてread_timeout以内に処理が終わらなかった。

“`ruby:spec/models/ファイル名_spec.rb

RSpec.describe UserAddress, type: :model do
before do
@user = Fact

元記事を表示

単体テストのエラー 〜ActiveRecord::RecordInvalid: Validation failed: Email has already been taken〜

単体テストして変なエラーが出たので備忘録として残しておきます

結論

「そのメールは既に登録されているよ」って怒られてます。

この時僕はFakerでメールを作らずに手入力で入れていてのでテスト内でuserが何度も作成されるにあたって手動で入れてしまうとメールが重複してしまった、と言うことになります

以下コード

“`ruby:fuctories/user.rb

FactoryBot.define do
factory :user do
nickname {“tarou”}
email {“sanple.sample@com”}
#emailを以下に変更⬇︎
email {Faker::Internet.free_email}
#emailを上記に変更⬆︎
password {“a1234567”}
password_confirmation

元記事を表示

Ruby on Railsでアプリを作ってみよう②

##MVC(エム・ブイ・シー)
Railsを始めアプリケーションの処理を表しています。
M=モデル
V=ビュー
C=コントローラー

これからアプリケーションの処理の流れを順番に解説していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/6d644d84-be80-590b-84e0-aaf7fc52f939.png)

それではリクエストを振り分ける役割のルーティングから説明していきます

##ルーティング
クライアントからのリクエストに対して対応した行き先を指定します。
トップページをみたいというリクエストがあったとしたら、トップページを表示するための処理にいく道筋をたてます。
configディレクトリのroutes.rbに記述していきます。

“`
Rails.application.routes.draw do
HTTPメソッド ‘URIパターン’, to: ‘コントローラー名#アクション名’
end

“`

###HTTPメソッド
Webアプリ

元記事を表示

Ruby on Rails6でのjQueryの実装方法(Windows10 + 仮想環境)

Rails5までの実装方法を試してみてもjQueryが動かなかったので調べてみると、
Railsのversionが上がり、Rails6になってからはjQueryの実装方法が変わったようなので、
自分の勉強もかねて、読んでくださる方々に共有させていただきます。

※プログラミング初心者ですので、おかしい点などがありましたら指摘してもらえると助かります。

## 開発環境
– 使用PC:Windows10
– 仮想環境:vagrant + CentOS7
– テキストエディタ:VSCode
– Ruby version:ruby2.5.8
– Rails version:6.1.1

## 実装したい環境

Ruby on Rails6での環境でjQueryを実装したい

## 目次
1. jQueryインストール
2. application.jsのファイル先の変更
3. Webpackの設定
4. application.jsの設定
5. 外部ファイル作成

#### 1. jQueryインストール
Rails5までのverでは、GemfileにjQueryを記載して`bundle

元記事を表示

Railsのルーティングについて学び直そうと思う…①

#はじめに
学習初期から、ルーティングについては、`resources`を使うことが多かったので、よく理解できていない部分が多々あったので、少しずつ調べて紹介していこうと思います。

##リソースを同時に定義する

“`ruby
resources :users
resources :admins
“`

“`ruby
resources :users, :admins
“`
上の2つは全く同じです。
`resources`を全て使うなら、まとめた方が読みやすいですね。

元記事を表示

#Rails redirect_toではhttpリクエストをgetからdeleteに変更できない!?

#Rails redirect_toではhttpリクエストをgetからdeleteに変更できない!?
rails 5.2.2
を使ってます。

今回はユーザーの退会ボタンを押したら退会処理がなされてかつ、ログアウトされ、ログイン画面に飛ばすような設計にしてそれを実装しようとしていたのですが、そこで問題が発生しました!!

それは退会処理後のログアウトを呼び出そうとして
redirect_to user_sessions_path
を実行したところ、「httpリクエストがgetですよ」とのことでdeleteに修正しようとしたが
残念
redirect_to user_sessions_path, method: :delete
ではできなかった
これ以上解決方法が浮かばなかったのでいろいろ調べたところ
deleteになってしまった場合はstatusコードを編集することでgetにできるらしいが
getからdeleteは無理なようだ・・・
postは指定できないことは知っていたがまだredirect_toに弊害があったとは・・・

皆さんもきおつけてくださいね
僕はこれに2時間近く囚われて

元記事を表示

OTHERカテゴリの最新記事