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

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

Railsチュートリアル 第14章 ユーザーをフォローする – Relationshipモデル

# データモデルの問題 (および解決策)

別記事で解説します。

* [Railsチュートリアル 第14章 ユーザーをフォローする – Relationshipモデルにおけるデータモデルの問題 (および解決策)](https://qiita.com/rapidliner00/items/f543e266b034070ff752)

# 演習 – データモデルの問題 (および解決策)

## 1. [図 14.7](https://railstutorial.jp/chapters/following_users?version=5.1#fig-user_has_many_following)のid=1のユーザーに対して`user.following.map(&:id)`を実行すると、結果はどのようになるでしょうか? 想像してみてください。

> ヒント: [4.3.2](https://railstutorial.jp/chapters/rails_flavored_ruby?version=5.1#sec-blocks)で紹介した`map(&:method_name)`のパターンを

元記事を表示

Railsチュートリアル 第14章 ユーザーをフォローする – Relationshipモデル – フォローしているユーザー

# 「フォロー」という関係性の特徴

今回のサンプルアプリケーションで使う「フォロー」という関係性には、以下のような特徴があります。

* 1人のユーザーは、0人以上の任意のユーザーからフォローされる
* 1人のユーザーは、0人以上の任意のユーザーをフォローする

こうした関係性は、データモデルの問題 (および解決策)でも触れたように「多対多」と呼ばれます。`relationships`なるテーブルが必要になった理由も、フォロー関係が多対多の関係性であることが理由ですね。

# Railsにおいて、あるテーブルから交差テーブルを介して多対多の関係性を取得するには

今回は、「`has_many :through`という関連付けを使う」というという手段をとります(他には「`has_and_belongs_to_many`という関連付けを使う」という手段もあります)。

## `has_many :through`関連付けの基本的な記法

Userモデルにおける以下のような記法が、`has_many :through`関連付けの基本的な記法となります。

“`ruby:
has_many

元記事を表示

Railsチュートリアル 第14章 ユーザーをフォローする – Relationshipモデル – Relationshipのバリデーション

# Relationshipに対するバリデーションのテスト

Relationshipモデルを生成した時点で、Relationshipモデルに対するテストである`test/models/relationship_test.rb`も生成されました。`test/models/relationship_test.rb`の内容は、以下のような内容とします。

“`ruby:test/models/relationship_test.rb
require ‘test_helper’

class RelationshipTest < ActiveSupport::TestCase def setup @relationship = Relationship.new( follower_id: users(:rhakurei).id, followed_id: users(:mkirisame).id) end test "should be valid" do assert @relat

元記事を表示

Railsチュートリアル 第14章 ユーザーをフォローする – Relationshipモデル – User/Relationshipの関連付け

# 基本は`has_many`と`belongs_to`

User/Relationshipの関連付けは、以下の条件が基本となります。

* 1人のユーザーには1対多(`has_many`)のリレーションシップが存在する
* 当該リレーションシップには、フォローしているユーザーとフォローされているユーザー両方が属する(`belongs_to`)

最終的には、「`user`と`active_relationship`に関して以下のようなメソッドが使えるようになる」というのが完成像です。

* `active_relationship.user`
* `user.active_relationships`
* `user.active_relationships.create(followed_id: …)`
* `user.active_relationships.create!(followed_id: …)`
* `user.active_relationships.build(followed_id: …)`
* `user.active_relationships

元記事を表示

Railsチュートリアル 第14章 ユーザーをフォローする – Relationshipモデルにおけるデータモデルの問題 (および解決策)

# 「フォロー」という関係の定義

今回開発を行うサンプルアプリケーションでは、ユーザーとユーザーの関係性として、「フォロー(follow)」という関係を定義します。フォロー関係のより具体的な定義は以下の通りです。

* 1人のユーザーは複数のユーザーをフォローする
* 1人のユーザーは複数のユーザーによってフォローされる
* フォロー関係は左右非対称である
* 「AがBをフォローする」と「BがAをフォローする」は異なるものである
* この点は、例えばFacebook等における「友好(friendship)」とは異なる関係である

# テーブル名の定義

Railsチュートリアル本文では、フォロー関係のテーブル名の定義として、以下のようなルールを採用することとしています。

* あるユーザー**を**フォローしているユーザーの集合は`followers`とする
* あるユーザー**が**フォローしているユーザーの集合は`following`とする

「AはBのフォロワーである」を英語にすると「A is a follower of B」となります。一方、「BはAによってフ

元記事を表示

RailsでFormオブジェクトを使おう

# MVCを学んだ初心者にありがちな悩み

## コントローラーに全ての処理を書くことでコードが読みづらくなる
## モデルのメソッドが複雑になりすぎてしまう(Fat Model)

# Formオブジェクトを使うメリット
## Controllerがすっきりする
## Form内で複数のモデルがあっても大丈夫

元記事を表示

初心者が手探りで Rails のタグ付機能を gem なしで実装してみる

## はじめに

ブログ記事を投稿するアプリケーションで記事を投稿する際にタグ付けする機能を実装してみました。

Rails 初心者が出来る限り自力で実装してみました。おかしい点や改善点などあればコメントで指摘していただけると嬉しいです。

Rails : 6.0.2
Ruby : 2.7.0

## 仕様

– 記事投稿フォームにユーザーが任意のタグを入力してもらう
– タグは複数設定できる
– タグを一意(ユニーク)に保ちたい
– タグをアルファベットの大文字・小文字で区別させたくないので、タグが保存される前にアルファベットを全て小文字に変換して保存する
– タグ DB に既に存在する場合と存在しない場合で処理を分ける
– タグが既に存在する場合は、タグを DB から取得して紐付ける
– タグ名が DB に存在しない場合は、タグを作成して紐付ける

## 手順

1. 各モデル(Article, Tag, 中間モデル)を作成する
2. Articles コントローラを作成
3. アソシエーションの設定
4. ルーティングを設定
5. Articles コントローラを編

元記事を表示

Rails 秘密情報管理機能の変遷

Rails での秘密情報の管理機能がバージョンごとに大きく違っている件について、まとめておきます。

### Rails 4.1

– `config/secrets.yml`

秘密情報を格納する設定ファイルとして `config/secrets.yml` が追加されました。

このファイルの設定値は `Rails.application.secrets` で取得できます。

この設定ファイルの設定値は、同一ファイル内で、環境別に分けられており、本番環境での設定値は VCS へコミットされても問題ないよう、通常、環境変数を参照するようにします。

“`yaml
development:
secret_key_base: a4f6336a67817352a26e098403561530cdecdea6f9031deac218a8369b13fb39ba5e9663d59a3a379d88b5609d56e83457dc6b04ef11ce90d7e3cbcd98814199

test:
secret_key_base: 7c0558816ee4552593e89a69184

元記事を表示

チーム開発時に起きえる、migrationファイル・テーブルが起こす大混乱と、その解決方法

#はじめに
アプリ作成に必要なのがデータベース-テーブルです。
これの作成や編集には色々な手間がかかりますが、
チーム開発では恐ろしいエラーが出てくることがあります。

今回はその解決方法を一つ提示したいと思います。

#状況
4人チーム開発を行っている。
使っているテーブルは`users`と`products`。
ある時、それまでできていたブランチを全てmergeし、チーム全員にpullしました。
その後`rails s`でエラーが出ました。
「migrationしなさい」といったエラーです。
そこで、ターミナル上で`rake db:migrate`をすると、`already exists ‘products’`という様なエラーが出て、`rake db:migrate`ができません。

#原因
人によってマイグレーションファイルの作り方が異なる=テーブルが違うので、全てをマージしたマイグレーションファイル群をまとめてmigrationすると、色々問題が起きるようになるようにしました。(同じマイグレーションファイルが二つあるなど)

#対策
まずは***作業用のbranchを作成***

元記事を表示

Rails 5 から 6 にかけての secretes / credentials 周りの変遷

# 概要

* Rails で秘匿情報を扱うための機能 (secrets.yml.enc / credential.yml.enc) は、直近の数バージョンでかなり動きがあり、情報が錯綜していたので、自分なりに整理してみました

# 歴史

## Rails 5.1

* secrets 機能が実装された
* config/secrets.yml.env と `config/master.key` がペアになっている
* `config/master.key` の代わりに `RAILS_MASTER_KEY` 環境変数でも OK

## Rails 5.2

* credentials 機能が実装された
* ほぼ secrets と同じ
* config/credentials.yml.enc と `config/master.key` がペアになっている
* `config/master.key` の代わりに `RAILS_MASTER_KEY` 環境変数でも OK
* config/credentials/環境名.ym

元記事を表示

同一ページに二つのformを設置する

##別モデルのformを同一ページに別々に設置。

今回も、少し苦労したのでメモとして残します。

##説明

categoryモデルと
memo_roomモデルを用意。

**■やりたい事**

・ページ内でカテゴリの新規追加と
・メモルーム(トークルームみたいな感じ)の作成をするフォームを別々で保存し実装したい。

“`

カテゴリを新規作成する場合はこちらに入力してください。

<%= form_with(model: @category, url: categories_create_path, local: true) do |f| %>
<%= render 'layouts/error_messages', model: f.object %>

<%= f.text_field :title, class: 'form-control', rows: 1, placeholder: "カテゴリ名20文字以内で作成してください" %>
元記事を表示

Ruby on Rails でのSyntax error

#はじめに
Ruby on Railsにてrails newコマンドを叩いたときに謎のSyntax errorを吐いていたのでメモ
こういう記事誰も書いてないっぽいのでなんだか得した気分。

#環境
Rails 6.0.2.1
Ruby 2.5.0
rbenv 1.1.2
#Syntax Error
最後の行にてエラーを吐いた
どうやらtest.rb.ttの10行目に文法エラーがあるらしいとのこと

“`
MacBook-Pro:Ruby on Rails Your name$ rails new asagao –skip-bundle
create
create README.md
—中略—
/Users/Your name/.rbenv/versions/2.5.0/lib/ruby/2.5.0/erb.rb:885:in `result’
/Users/Your name/.rbenv/versions/2.5.0/lib/ruby/2.5.0/erb.rb:885:in `eval’: /

元記事を表示

N+1問題への対処

#N+1問題とは
あるテーブルへのアクセス1回に対して、関連するテーブルが呼び出した分(N回)発行されてしまう状況のことを指し、これが何万回、何十万回と呼び出された時に動作が重くなってしまう問題のこと。

# 対処法
**includes**メソッドを使用することで、あるテーブルにアクセスする際に、同時に関連するテーブルのレコードを取得し、発行するSQLを少なくすることができる。
**includes**メソッドは、1つ目のテーブルのカラムを優先して、2つ目のテーブルを結合する。その際に2つのテーブルのどちらにしか存在しないテーブルも含める。(左外部結合

ちなみに反対にテーブル同士を結合する時に両方のテーブルで結合条件がマッチするレコードのみを取得する方法が内部結合になる。

スクリーンショット 2020-01-29 20.33.20.png【Rails】アンカー付きリンクの書き方

調べるのに5分くらいかかってしまったのでメモしておきます。

“`erb
<%= link_to 'サンプル', sample_path(anchor: 'hogehoge') %>

<%= link_to(sample_path(anchor: 'hogehoge')) do %>

サンプルテキスト

Hello World!

<% end %>
“`

##参考
[Rails でアンカー付きのリンクの書き方](https://machida.github.io/articles/20160712-anchorlink/)

元記事を表示

Controller createアクション ストロングパラメーター

#Controller createアクション#
###ストロングパラメーターとは###

Web画面から送られてきたデータを保存(create)する時に、安全に保存する仕組み。
“groups_controller.rb”のprivateよりも下の部分。

“`rb:groups_controller.rb

def create
@group = Group.new (group_params) #paramsメソッドを使用。 ストロングパラメータを引数として記述。
if @group.save
redirect_to root_path, notice: “グループが作成されました” #cretaeされたらrootに移動。
else
render :new
end
end
  ・・・
  (省略)
  ・・・
private #まずはprivateを記述。
def group_params #privateを記述してにストロングパラメーターを定義。
params.require(:group).

元記事を表示

【rails】CarrierWave 保存できなくて嵌められる

Macを買い替えた後に、railsのcarrierwaveを使って保存できなくなってしまった。

いろいろ調査するが、だいたい「multipart: true」にする記事ばかり、、、

地道に調査を進めると、答えにたどり着いた。

“`ruby:uploaders/imageuploader.rb
include CarrierWave::MiniMagick
process resize_to_fit: [400, 400]
“`

これ!
これを消すだけでした。。

MiniMagickのgemを使うには、imagemagickのインストールとかのした準備が必要らしい。。

画像が保存できないだけで、7,8時間無駄にしてしまったので、共有です。

以上

元記事を表示

【Rails】 FullCalendar カレンダー内でのドラッグによるイベント新規作成方法

# はじめに
Rails アプリケーションにて、 FullCalendar カレンダー内でのドラッグをするとイベントを新規作成できる方法について説明します。
scaffold で Eventモデルを作成しているため、最低限の作業量でカレンダーに機能を追加する方法を実現しています。

### イメージ

赤色の矢印方向へドラッグすると、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/a4c69f44-9dac-d832-a849-86af8e4fbaf9.png)

新規でイベントが作成できる方法について説明します!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/91b1245b-07d6-affb-8fc9-6d215efcdf85.png)

#### 関連リンク
関連リンクを下記に載せておくので、必要であれば参考にしてください。。

* 【Rai

元記事を表示

[git rebase] ブランチにmasterの情報を持ってきて作業するにはどうすればいいの?

**やり方や仕組みを記述したちゃんとした記事はたくさんありますのでリンクをご参照ください。**

ブランチで作業してるけど、作業中に他のメンバーがマスターにマージしてマスターの情報が
新しくなった!
という時に、作業中の自分のブランチにマスターの最新情報を追加して自分がマージ
した時のコンフリクトを最小限に抑えたい&マージされた内容をもとに実装をしたい
と言ったことを考え使うコマンドがリベースという認識でおります。
(もっと他にあると思いますが、自分なりの解釈です)

##環境
■GithubDesktop使用
■ターミナル
■プルリクはしていません(プルリクあげてるものはGithubでプルリクをcloseしています)
[プルリクエストをクローズする](https://help.github.com/ja/github/collaborating-with-issues-and-pull-requests/closing-a-pull-request)
■commitはしてます

猿とおんなじレベルの自分でも理解できるように自分なりに噛み砕いて記述します。
実行したこととエラーについて

元記事を表示

rspecで既存の並行処理に対してテストを追加したら fatal – No live threads left. Deadlock? エラーが起きた。

# 序

rails5にて。
とある、パラレル処理を行っているコントローラーがあった。

イメージ

“`ruby

Parallel.each(records, :in_threads=>4) do |r|
Blablabla::BullshitService.new(r.dead_beaf).bullshit
end

“`

リファクタのためにrspecでrequestsのテストを書いていたら、実行時に
`No live threads left. Deadlock?`
というエラーになって失敗した。

イメージ

“`bash

$ bundle exec rspec spec/requests/api/blablabla_controller_spec.rb

fatal – No live threads left. Deadlock?
4 threads, 4 sleeps current:0x000055d836b087e0 main thread:0x000055d82d7f48e0
* #

元記事を表示

脱Webpacker Rails

## Rails + Webpack
Rails6.0からデフォルトでWebpacker(WebpackをRailsでラップしたGem)が搭載されていますが、無駄に処理がわかりにくくなっており、使い勝手がよくありません…
脱Webpackerをして、RailsにWebpackを導入してみます。
以下にボイラーテンプレートを置いておくので、よければ参考にしてください。

https://github.com/Tak-Iwamoto/rails-webpack-boiler-template

## 1. Rails関連
– 以下のGemは使用しないので削除する。

“` Gemfile
//
gem ‘sass-rails’, ‘>= 6’
gem ‘webpacker’, ‘~> 4.0’
gem ‘turbolinks’, ‘~> 5’
//
“`

– app/assets, app/javascriptを削除する。
– asset precompileを無効にする。
config/application.rbに以下の設定を追加し、
assets precompileを

元記事を表示

OTHERカテゴリの最新記事