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

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

【RSpec】described_classについて

## はじめに
RSpecを書くときに、`described_class`を使うようにアドバイスをいただきました。

今回は、`described_class`の使い方と使う理由を説明していきます。

## described_classの使い方

通常、このようにモデルの処理を書くと思います。

“`rb:user.rb
RSpec.describe User do
subject {User.new}
end
“`

`described_class`を使うと下記のように書けます。

“`rb:user_spec.rb
RSpec.describe User do
subject {described_class.new}
end
“`

`User`が`described_class`に変わりました。

この`described_class`が何者かというと、

RSpec.describeの直後に書かれているモデルなんです。

“`rb
RSpec.describe User do # Userがdescribed_class
end
“`

##

元記事を表示

Rails ~データベースについて~

#概要
データベースについての理解を深めるために作成。
学習内容を忘れない用に記載する。

#データベースのしくみ
Railsでのデータベースは表による管理が多い。
・表そのもののことを「テーブル」という。
・縦列のことを「カラム」
・横列のことを「レコード」という。

データベースにデータを保存するためには「テーブル」を作成する必要がある。
データベースに変更を加えるためには右の図のような2つの手順が必要。

① データベースに変更を指示するファイルを作成する
② データベースに変更を反映する

まずマイグレーションファイルと呼ばれる、データベースに変更を指示するためのファイルを作成する。postsテーブルを作成するマイグレーションファイルは
“`
rails g model Post content:text
“`
というコマンドで作成が行える。
g はgenerateでも可 contentはカラム名 textはデータ型を表す
「postsテーブル」を作成する場合はPostと単数形にする。

元記事を表示

Apartment & PostGIS

Apartment を使用してマルチテナント化したプロジェクトに PostGIS を導入する場合、詰まりどころがいくつかあったため記録します。

## 基本的な設定

Rails で PostGIS を使う場合 [activerecord-postgis-adapter](https://github.com/rgeo/activerecord-postgis-adapter) を使う場合が多いようです。
それに加え、複数テナントから PostGIS 用のテーブルを参照できるように設定してあげる必要があります。
まずは下記のドキュメントと issue を参考に設定を変更します。

https://github.com/influitive/apartment#1-ensure-the-extensions-schema-is-created-when-the-database-is-created
https://github.com/influitive/apartment/issues/534

“`diff:Gemfile
+ gem ‘activerecord-postgis

元記事を表示

コメント機能を実装

##コメント機能
今回、コメントはどのツイートに対してのコメントなのか、誰の投稿したコメントなのかが必要になります。そのため、userモデルとtweetモデルがあるとします。まずはその2つとアソシエーションを実装します。
まずはターミナルでモデルを生成します。
【例】モデル名をComentとします。

“`
$ rails g model comment
“`
##次にマイグレーションの中身を編集します。
【例】

“`db/migrate/20XXXXXXXXXXXX_create_comments.rb
class CreateComments < ActiveRecord::Migration[5.2] def change create_table :comments do |t| t.integer :user_id t.integer :tweet_id t.text :text t.timestamps end end end ``` 上記のように記述すると、コメントの本文はtextカラムに保存

元記事を表示

アソシエーションで子要素を持つ親要素だけ取得したい場合

子要素を持つ親要素だけ取得したい場合、SQLによる抽出が必要となる。
Railsでは何気なくuser.productsなど取得しているが、これはRailsがSQLの記述を省略しているにすぎない。複雑になれば、SQLは必要となる。

## 本題
子要素を持つ親要素のみ取得したい場合どうすればいいでしょうか??
何気にわからないと思います。

親要素:User
子要素:Product

productを持つUserだけ取得したい場合、下記になります。

“`ruby:子要素を持つ親要素だけ取得1
User.joins(:products).preload(:products)
“`
この処理だとSQLとしては下の処理がされます。

“`sql:
User Load (3.2ms) SELECT `users`.* FROM `users` INNER JOIN `products` ON `products`.`user_id` = `users`.`id`
“`
`products`.`user_id` = `users`.`id`で成立するレコードだけを残します。
つまり、p

元記事を表示

omniauthを使った認証時にsessionが消える時の対処法

# 事象
auth0とomniauthを利用して認証処理を作成した。
omniauthの以下のフローがあるが、2の時点では保持しているsessionが、3になるとnilとなってしまい、ログインできないという事象が発生した。
1. プロバイダー側で認証後、railsアプリケーションのcallback関数呼び出し
2. callback関数で諸々処理し、画面にredirect
3. 画面に対応するcontrollerで処理後、画面表示

さらに、ログインできたアカウントが一つ、ログインできなかったアカウントが3つという状態もあり、原因特定に時間がかかった。

# 環境
– Ruby 2.7.0
– Rails 6.0.2.1
– omniauth 1.9.0
– omniauth-auth0 2.2.0
– omniauth-rails_csrf_protection 0.1.2

# 原因
結論から言うと、`3. 画面に対応するcontrollerで処理後、画面表示`の段階で、cookieに保存していたsessionが4KBを超えてしまい、sessionが削除されてしまったのが原因。

元記事を表示

最低限の『メッセージと複数画像を投稿できるRailsアプリ』を丁寧に作る

# この記事の基本的な方針
メッセージと画像を投稿できるアプリはよくありますが、それが複数の画像となると難易度が格段に上がります。
ここでは、『一度にメッセージと複数画像を投稿できるRailsアプリ』を、極めて丁寧に、誰も置いてきぼりにならないように、プログラミングの基礎ががっちり固まるように、説明いたします。

この記事は、過去の記事[『超最低限のRailsアプリを丁寧に作る』](https://qiita.com/annaPanda8170/items/8856425be9d563fbffa7)の続きです。10分程度でできる工程ですので先に済ませてしまうことをオススメいたします。が、仮にこちらが済んでいなかったとしても読めるように努めます。
# 想定する読み手
既に一度Railsアプリをチュートリアルやスクール等で作ったことがある方であり、JQueryの基本文法を理解しており、過去の記事[『超最低限のRailsアプリを丁寧に作る』](https://qiita.com/annaPanda8170/items/8856425be9d563fbffa7)のアプリを持っている、または理解

元記事を表示

世界一簡単にNginx + MySQL + PumaでRuby on RailsをAWSにデプロイする

##はじめに

ProgateのRailsコースを終え、いよいよ自分のアプリをデプロイしてみたい!
というような方や、
HerokuではデプロイできたけどAWSはさっぱり…
といった初心者の方向けに、できるだけ簡単に分かりやすくAWSにRailsをデプロイする手順をまとめました

– DBはMySQL(MySQL5.7)

– WebサーバーはPuma + Nginx

– EC2(アプリをアップロードするAWS上のコンピューター)はAmazonLinux2

というような構成で環境構築をします

図で表すとこんな感じですね!

![aws_single.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559794/bfeff559-f279-9147-0ea6-04bfd6a42f58.png)

早速進めていきたいですが、気をつけて頂きたいのが、紹介しているコードの中で例えば、

~~~
 /var/www/rails/{アプリ名}
~~~

などと書いている時がありますが、自分の

元記事を表示

復習

ER図
Entity-Relationship Diagramの略でテーブル同士の関係を視覚的にわかりやすく表した図

バリデーション
空のツイート投稿ができないようにバリデーションの設定

rails routesコマンドを実行
Prefix 「Prefix」はルーティングの名前を表しています。「Prefix」は設定を行わなくても、自動的に割り当てられますが、自ら設定することもできます。
Verb 「Verb」はHTTPメソッドを表しています。右側に表示されているパスにどのHTTPメソッドでアクセスするかを示しています。
URI Pattern 「URI Pattern」はルーティングのパスを表しています。このパスにアクセスされた際に、指定のコントローラーとアクションで処理が行われます。
Controller#Action 「Controller#Action」は指定したパスにアクセスした際に処理が行われるコントローラーとアクションを表しています。#以前がコントローラー名、#以後がアクション名を示しています。

HTTPリクエストのメソッド

| GET | サーバーからブラウザに情

元記事を表示

本番環境でbackground-imageが反映されない時の解決法

##本番環境でbackground-imageが反映されない。

これで詰まる人が多そうなので、共有します。

ググると、
background-image: url(***.jpg);でうまくいくよ。
とか、拡張子jpgをpngに変えろとか言う記事がありますが、

正しくは、

“`
background-image: image-url(“***.jpg”);
“`
です!これで、本番環境でもCSSが反映されます。

元記事を表示

他のメンバーがデプロイしたアプリのサーバーを本番環境で立ち上げようとすると、エラーが起こる時の解決方法。

###結論としては、本番環境の設定ファイルに直接、「master.key」を書き込んだら解決できました!

具体的には、configディレクトリ直下にmaster.keyファイルを作り、その中に、デプロイした人からマスターキーの暗号を教えてもらい、コピペする。これでデプロイした以外の人でも本番環境でサーバーを立ち上げられるようになります!

元記事を表示

Railsアプリ開発で陥りがちなエラーとその対策集

## この記事は
表題の通り、Railsアプリ開発で陥りがちなエラーとその対策をまとめた記事です。
主にrbenvによるバージョン切り替えができてなかったり、元に戻ってしまったりすることに起因することが多いです(体感)。

随時追記していきます。
間違いなどあれば、ぜひツッコんでいただけるとありがたいです。

## `rails s`または`bundle update –bundler`すると、`You must use Bundler 2 or greater with this lockfile.`というエラーが出る

これはbundlerのバージョンが2.0.1以降で出るエラーだそうです。
今のところ、それより前のbundlerのバージョンに戻すのが一番早そう。

### 対処法

[こちらのQiita記事](https://qiita.com/yoshijbbsk1121/items/87250501b32c6433943e)を参照すると、うまくいきました。

※Gemfile.lockを削除するというロックなことをするので、テスト用のブランチを作って作業して、問題ないことが

元記事を表示

[API][YouTube][第弍章]Googleアカウント認証

##HTLMの用意##
“`html:haml
%section
.container
.container-nest
%p.google-log Log in With Google
%button.btn.red#authorize-button
Log in
%button.btn.red#signout-button
Log Out
    %br/
#content
.row
.col.s6
%form#channel-form
.input-field.col.s6
%input#channel-input{:placeholder => “Enter Channel Name”, :type => “text”}
%input.btn.grey.lighten-2#submits__btn{:type => “submit”,

元記事を表示

[API][YouTube][序章]YouTubeAPIをアプリで使用する為の準備

##前置き##
YouTubeAPIを使用してクリエイターの情報の取得方法を解説していきます!!
と言いたいところですが、一記事に全て書くとなるとかなり冗長になるので、今回は第一弾としてYouTubeAPIを使用する為の前段階を解説していきます。
意外とすぐ最終章になりますので、自作アプリでYouTuberのチャンネル登録者数や視聴回数、最新の動画などを使いたい!!
という方は是非見ていってください。
最後に続編のリンクを貼っておきますので、お手柔らかによろしくお願い致します。

##APIキーの作成##
スクリーンショット 2020-03-08 13.29.01.png

ではまず、[Google Cloud Platform](https://console.cloud.google.com/)にアクセスし新

元記事を表示

Railsチュートリアルメモ – 第9章

[メモの目次記事はこちら](https://qiita.com/yokohama4580/items/dedfd5510080273dc2a0)

[公式Railsチュートリアル第9章へのリンク](https://railstutorial.jp/chapters/advanced_login?version=5.1#cha-advanced_login)

## 9.1 Remember me 機能

ブラウザを閉じてから再度開いてもログイン状態が継続できるようにする。
8章ではsessionメソッドを使って一時的なセッション(ブラウザを閉じるまで)を実現したが、9章ではcookiesメソッドを使ってセッションの永続化を行う。
cookiesを永続化するとセッションハイジャックという攻撃を受ける可能性があるので注意が必要だが、Railsだと対策ができているので大丈夫らしい(知らんけど)。

ここらへんから説明がややこしくなって脱落しそうになってくる。
やっていることはパスワードの実装と似ていて、
1. ランダムなトークンを生成する
2. 生成したトークンをハッシュ化し、DBに保存する

元記事を表示

ページネーション

##ページネーション
長い文章を複数のページに分割して、各ページへのリンクを並べアクセスすることです。
まずはkaminariというGemをインストールします。
追記する場所は、Gemfileの最後の行です。

“`
gem ‘kaminari’
“`
“`
$ bundle install
“`
##pageメソッド
kaminariを導入すると、モデルクラスにpageメソッドが定義されます。このメソッドは、ページ数を指定します。
kaminariによってリクエストの際paramsの中にpageというキーが追加されています。その値がビューで指定したページ番号となるため、pageの引数はparams[:page]となります。
##perメソッド
kaminariを導入すると、モデルクラスにperメソッドが定義されます。このメソッドは、1ページあたりに表示する件数を指定します。perメソッドに引数として渡した数字が、ページネーションが実装されたビューで1ページあたりに表示するレコードの件数になります。
【例】

“`
変数名 = クラスを利用して取得したレコードのインスタンス.

元記事を表示

Gem 探報録 Shortener: Rails側で短縮URLを生成しよう!

# 【概要】

初めて自分主導で Gem を導入するため、ざっと調べてみた。

# 【本文】
## □ shortner とは?
– Rails アプリケーション内で短縮URLを生成できる!
– 短縮 URL を利用した計測もできる!(ユーザー等のモデル毎の計測も!)
– めっちゃ長いパラメータ付きのURLも省略できる!
– アプリケーション内でも外部でも、どこでもリダイレクトするよ!

“`ruby:短縮URLとは
# 長いURLが…
“http://localhost:3000/account_activations/C7EYgDf43N5OOh0S92wJlg/edit?email=user%40example.com”

# 短いURLに…!?
“http://localhost:3000/rd/fisafaf”
“`

### ■ 概要
– Shortener は 大別して3つの要素で構成される
– Model では、短縮 URL の情報を保存
– Controller では、短縮 URL のアクセスが来たら、元の URL へリダイレクト
– Help

元記事を表示

Railsで定期的に実行したい処理を、rakeタスクを使って実装する。(おまけ:Wheneverとの連携)

「Railsで定期的に実行したい処理を、lib/tasks以下のディレクトリに、rakeタスクを作成して処理を記述することが多い。」という話を聞いてrakeタスク??となったので、調べました。
以下にまとめて記載します。

#そもそもrakeとは
rake:Rubyで書かれたコードをタスクとして作成しておき、必要に応じて呼び出し実行する事が出来る機能です。

#rakeタスク
アプリケーションを起動せず、行いたい処理をCUI(コマンドプロンプトやターミナル)から実行でき、サーバーを起動せず任意の処理を実行できます。
つまり、冒頭のコメントにある”Railsで定期的に実行したい処理”をrakeタスクを作成して処理するというのは、例えば、以下のようなときに使えます。

– 何かしらのデータの連携
– データベースのバックアップ
– 定期的にデータを更新、削除する

#rakeタスクの使い方
##1.Rakeタスクファイルを生成
まず、処理を記載するためのrakeファイルを作成します。

“`:ターミナル
$ rails g task ファイル名
“`
上記コマンドを実行するとlib/t

元記事を表示

orderメソッド

##orderメソッド
orderメソッドは、並び順を変更するメソッドです。
【例】モデルをTweetとします。

“`
インスタンス = モデル名.all.order(“並び替えの基準となるカラム名 並び順”)
“`
上記で設定できます。
並び替えの基準にはASC(昇順)とDESC(降順)の2種類があり、ASCは値が古いものから新しいのものになり、DESCはその逆で新しいものから古いものになります。
今回はcreated_at(作成日時)をDESCしてみます。

“`app/controllers/tweets_controller.rb
〜省略〜
def index
@tweets = Tweet.includes(:user).order(“created_at DESC”)
end
〜省略〜
“`
上記でTweet.includes(:user)はN+1問題の解消、order(“created_at DESC”)でcreated_at(作成日時)が投稿したときに新しいものから古い順になります。

元記事を表示

【RSpec】ヘルパーで定義したメソッドを読み込まないときの対応

#はじめに
RSpecでの統合テストをかいているときに、
テスト用ヘルパーに定義したメソッドを読み込んでくれず、エラーになってしまう問題でつまりました。
割としょうもない原因でしたが、同じエラーにあった人の参考になりましたら幸いです。

#バージョン
Ruby 2.7.0
Rails 6.0.2.1
rspec-rails 3.9.0
rspec-support 3.9.2

#発生したエラー
テスト用ヘルパーに定義したはずのメソッドが読み込まれてないのか、
テストを走らせると下記のようなエラーが発生。
`log_in_as`メソッドが定義されていないとの指摘。

“`
Failures:

1) ○○のテスト
Failure/Error: log_in_as(user)

NoMethodError:
undefined method `log_in_as’ for # (略)
“`

ちなみにテスト用ヘルパー(spec/supports/test_helper.rb)には、
下記のように`log_in_as`メソッドを定義している

元記事を表示

OTHERカテゴリの最新記事