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

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

【Rails】「教材シェア」アプリを作成しました

## 1.はじめに
閲覧していただきありがとうございます。
今回作成したアプリの経緯や開発の苦悩などをまとめました。
よろしければ、ご覧ください。
## 2.関連URL
アプリ:https://teaching-materials-app.herokuapp.com/
Github:https://github.com/suugakusan/teaching_materials_app
## 3.アプリ概要
教員同士で教材をシェアし、生徒と向き合う時間を確保することをテーマにしたアプリです。

* 教材のデータを作成・編集・削除機能
* フォロー機能
* 投稿への「お気に入り」機能実装し「お気に入り」したものは一覧で閲覧可能
* 投稿のタイトル(内容)で検索機能(教科名も可)

## 4.アプリの制作背景
 私が教員として働く中で、生徒と向き合う時間が十分に取れないほど、数多くの仕事で溢れていました。本来であれば、教材研究する時間を確保し、生徒に実りある学習を提供しなければいけません。 しかし、それ以外の業務に時間をかけており、教材研究が全くできないのが今の現状です。同僚も同じように、

元記事を表示

[Rails]基本理念について

# はじめに
本記事では、railsの基本理念について、まとめてみました。

# 基本理念

## DRY
railsでコードを書く時には、
同じ情報を繰り返し記述することは、コード的にも、見る人にも良くはありません。

`DRY`とは、`Don’t Repeat Yourselfの略`
`同じ情報を繰り返し記述しない`というものです。

`スマブラのドンキーコング`を想像してください。
(ちょっと強引ですので、ご容赦)

`DRYを意識していない`ドンキーコング

“`
ジャブ = ドンキーのAボタン
パンチを溜める = ドンキーのBボタン
ジャンプする = ドンキーのYボタン

– 「ドンキー」を修正する場合、3箇所もあるので、工数がかかる
– 一つだけ「ドンキー」のまま未修正に気づかなかった場合のリスク有
“`

`DRYを意識した`ドンキーコング

“`
fighter = ドンキー
ジャブ = fighter の Aボタン
パンチを溜める = fighter の Bボタン
ジャンプする = fighter の Yボタン

– 変更点が1つだけなので、修正工数が少ない

元記事を表示

railsチュートリアル第6章 ユーザーを検証する

##ユーザーを検証する
作成したUserモデルに、アクセス可能なnameとemail属性が与えられました。
しかし、これらの属性は“`どんな値でも“`取ることができてしまいます。現在は(空文字を含む)“`あらゆる文字列が有効“`です。
名前とメールアドレスには、もう少し“`何らかの制限“`があってよいはずです。
例えばnameは空であってはならず、emailはメールアドレスのフォーマットに従う必要があります。
さらに、メールアドレスをユーザーがログインするときの一意のユーザー名として使おうとしているので、メールアドレスが“`データベース内で重複することのないようにする“`必要もあります。

要するに、nameとemailにあらゆる文字列を許すのは“`避ける“`べき。
これらの属性値には、何らかの制約を与える必要があります。
Active Record では検証(Validation)という機能を通して、こういった制約を課すことができるようになっています。
ここでは、よく使われるケースのうちのいくつかについて説明します。
それらは存在性(presence)の検証、長さ

元記事を表示

railsチュートリアル第6章 ユーザーオブジェクトを更新する

###ユーザーオブジェクトを更新する
基本的な更新の方法は2つです。

“`rb
>> user = User.new(name: “Michael Hartl”, email: “michael@example.com”)
=> #
>> user
=> #
>> user.email
=> “michael@example.com”
>> user.save
(0.1ms) SAVEPOINT active_record_1
User Create (1.8ms) INSERT INTO “users” (“name”, “email”, “created_at”, “

元記事を表示

「1 – 20 / 35件 < >」のような日本語ページネーションを追加する[Rails, kaminari]

## はじめに

以下のようなページネーションを作成しました。
実現したコードを記載したいと思います。

![スクリーンショット 2021-09-24 17.34.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779676/e9242459-7e07-52f7-80dc-b8ed9e46e2f9.png)

## コード

“`html:app/views/tests.html.erb
<%= page_entries_info @tests %>
<% if @tests.total_count > @tests.limit_value %>
<%= link_to '<', path_to_prev_page(@tests) %>
<%= link_to '>‘, path_to_next_page(@tests) %>
<% end %>
“`

“`ruby:app/controllers/test_controller.rb
def index
@tests = Tes

元記事を表示

【Rails】DMが届いた際の通知機能を実装する

# はじめに

下記2つのQiita記事を参考にして、

* いいね
* コメント
* フォロー
* DM
* ブックマーク

された時に通知される機能を実装しました。

当記事では、**`DMの通知機能`**について
基本文法でつまづいたので、学習記録として残しています。

なお、コントローラーとモデルで分けて
実装していますので、似た構成にしたい方の参考になれば幸いです。

初学者のため、投稿内容に至らない点がありましたら、申し訳ございません…
修正が必要な箇所があれば、コメントなどでお知らせください。

# 参考記事(2つ)

https://qiita.com/nekojoker/items/80448944ec9aaae48d0a

https://qiita.com/facultyoflaw11/items/538862befd327e8dc918

# 前提

・DM機能を実装済み

# 実装前に考える…

まず、通知画面のViewで

* 通知を受け取るユーザーに何を情報として伝えたいか
* どこに画面遷移させると使いやすいか

の2点に留意しないといけません。

元記事を表示

本番環境で背景画像を表示

#課題
ローカル環境で表示できていた、背景画像が本番環境では表示されなくなった。調べてみたところ、アセットパイプラインにおいてエラーが発生していると分かった。備忘録として記録。
#行なったこと
####1.画像配置場所の変更
変更前:`app/assets/images/back.png`
変更後:`public/images/back.png`
####2.image-url( ) の利用
`css`を`scss`に変更し、`url(“back.png”)`を`image-url(“back.png”)`に変更。

“`index.scss
.main{
background-image: image-url(“back.png”);
}
“`
####3.本番環境でアセットパイプラインが自動で通るように設定を変更
変更前↓

“`config/environments/production.rb
config.assets.compile = false
“`

変更後↓

“`config/environments/production.rb
config.asse

元記事を表示

【Ruby on Rails】Captureメソッドを使ってテンプレート化をする方法

#対象者

* captureメソッドを使用したことない人
* テンプレート化を簡単に実行したい人

#目的

* captureメソッドを使用することで簡単にテンプレートを作成する

#実際の手順と実例
###1.captureメソッドとは

> captureメソッドを使用することで、テンプレートの一部を変数に保存することができます。保存された変数は、テンプレートやレイアウトのどんな場所でも自由に使用できます。
※Railsガイド参照

使ってみると使いまわしたい文章や表を簡単にテンプレート化できるなと考えて、使ってみました。

###2.メソッドの使い方

““index.html.erb
<% @greeting = capture do %>

ようこそ!日付と時刻は<%= Time.now %>です

<% end %>
““

この時点では、ページに表示されません。
あとは<%= @greeting %>を自分の好きな箇所に設置すればOKです!

#参考にさせて頂いた記事

* [Railsガイド 6.5 CaptureHelper](htt

元記事を表示

Ruby と Rails のバージョン表

##自分用にRailsとRubyの対応用表まとめてみたよ
|RailsVersion|必須Ruby|推奨Ruby|RubyGem|
|—|—|—|—|
|6.2.0|>= 2.5.0|3.0.x|>= 1.8.11|
|6.1.x|>= 2.5.0|3.0.x|>= 1.8.11|
|6.0.x|>= 2.5.0|2.6.x|>= 1.8.11|
||< 3.0.0||| |5.2.x|>= 2.2.2|2.5.x|>= 1.8.11|
||< 2.6.0||| |5.1.x|>= 2.2.2|2.5.x|>= 1.8.11|
||< 2.6.0||| |5.0.x|>= 2.2.2
< 2.5.0|2.4.x|>= 1.8.11|
|4.2.x|>= 1.9.3|2.2|>= 1.8.11|
|4.1.x to 4.2.0|>= 1.9.3|2.1|>= 1.8.11|
|4.0.5 to 4.1.0.rc2|>= 1.9.3||>= 1.8.11|
|4.0.0 to 4.0.x|>= 1.8.7||>= 1.8.11|
|3.2.x|1.8.7|2.2|>

元記事を表示

Ruby on Rails とは

webアプリ制作のフレームワーク

環境構築

・エディタ
 (VS codeなど)
・ターミナル
・SQLite
・Ruby

MVCモデルとは

・Model
 BD関連の処理を担当
・View
 画面表示(HTML)を担当
・Controller
 リクエスト受付&レスポンス返却

migrateというファイルはcreatテーブルなどテータベースの テーブル構成を定義するためのファイル

rails db:creat ———データベースが作成
rails db:migrate ———マイグレートファイルに書かれたcreatファイルが実行

元記事を表示

SPAのアプリケーションにおけるCookieの取り扱いについて

個人のアプリケーションを開発において、SPAにする機会が多いのですが、開発のたびにどのような設定をするんだっけ?と忘れてしまうことが多いです。
SPAの場合、バックエンドとフロントエンドをそれぞれデプロイし、オリジンが異なるケースがほとんどかと思いますが、この場合、知っておくべきこと、設定すべきことが多く忘れてしまいやすいので、バックエンドとフロントエンドに分けてまとめます。

## バックエンドについて対応すべきこと

### リクエストを受け付ける別オリジンを指定する

これによって、レスポンスの `Access-Control-Allow-Origin` ヘッダーには許可するオリジンが入り返却される。
**`*` で全オリジンを指定すると資格情報を共有できないので注意**する。資格情報を伴わないオリジン間のリソース共有であれば、`*`指定でも(セキュリティ的には問題があるものの)可能である。

以下、`https://example.com`からのリクエストを受け付けるように指定した場合のレスポンスヘッダー例

“`
Access-Control-Allow-Origin: h

元記事を表示

カスタムフォントが本番環境で適用されない

– 初心者かつ初投稿なので読みにくいと思いますが、容赦ください

####デプロイしたがカスタムフォントが適用されていなかった
やったこと
– scssファイル編集
– yarnのインストール
– プリコンパイル

######scssファイルの編集
編集前
_fonts.scss
“`@font-face {
font-family: “Koruri-Semibold”;
src: asset_url(‘assets/Koruri-Semibold.ttf’) format(“truetype”);
font-weight: normal;
font-style: normal;
}
“`
編集後
_fonts.scss
“`@font-face {
font-family: “Koruri-Semibold”;
src: asset_url(‘Koruri-Semibold.ttf’) format(“truetype”);
font-weight: normal;
font-style: normal;
}
“`
chromeの検証ツールの

元記事を表示

【Rails】非同期によるDMチャット機能の実装【細かく噛み砕いて解説】

# 前提条件
・Rubyバージョン2.6.5
・Railsバージョン6.0.0
・jQueryを導入済み→未導入の方は、自分が書いた[こちらの記事](https://qiita.com/RIN_HM/items/bdbd76f5015b3c15bfe9)をご参照ください。
・gem ‘devise’によるユーザー管理機能を作成済み。

・チャットページへの遷移元となるユーザー詳細ページを作成済み。

“`app/views/users/show.html.erb
<% if current_user.id != @user.id %>
<%= link_to "#{@user.name}さんとチャットする", chat_path(@user.id) %>
<% end %>
“`

# この記事の構成
①チャットに必要なモデルの作成
②各モデルへのアソシエーション及びバリデーション設定
③ルーティング設定
④cahtsコントローラーの作成と記述
⑤チャットをするビューの作成
⑥非同期処理に必要な`~.js.erb`ファイルの作成
⑦エラーメッセージを表示するファイルの作成

#

元記事を表示

いいねした投稿の表示の仕方

# いいねした投稿を表示させる方法

ポートフォリオにブックマーク機能を追加するにあたり、
どのユーザーがどの投稿をブックマークしたかを表示させるので悩んだので投稿したいと思います。
かなり初学者向けの内容です。

## ロジック

以前にいいねした投稿を表示させていたので、それを使い復習したいと思います。

ユーザーの詳細ページで自分がいいねした投稿を表示させる

“`users_controller.rb
def show
@user = User.find(params[:id])
@like_posts = Post.where(id: @user.favorites.pluck(:post_id))
end
“`

### まずuser_idを取得

“`.rb
@user = User.find(params[:id])
“`
### pluckを使う

pluckとは・・指定したカラムのレコードの配列を取得できるメソッド

ドキュメント参照
https://railsdoc.com/page/model_pluck

@userで取得したidのユーザーが

元記事を表示

act_as_paranoidで論理削除された子/親要素にアクセスできない時の対処方法

## 概要
掲題の通りハマったので自分のためのメモも兼ねて記載しておきます。

## 前提
店舗とそこに紐づく店員を表現するアプリを作るとします。
親をshop,子をclerkというテーブル名で作成します。
そして子要素経由で、親要素の名前やIDにアクセスする際にはactive recordのjoinやreferencesではデータが取得できません。
なので以下のように別のリレーションとして設定してあげて取得できるようにしてあげてください。

親クラス shop

“`ruby
class Shop < ActiveRecord acts_as_paranoid end ``` 子クラス clerk ```ruby class Clerk < ActiveRecord acts_as_paranoid belongs_to :shop belongs_to :with_deleted_shop, -> { with_deleted }, class_name: ‘Shop’, foreign_key: :shop_id, inverse_of: :Shop

元記事を表示

[SQL]基礎的なこと

# はじめに
本記事は、SQLの基礎的な部分について記述します。
そういえば、SQLってなんだっけ?と恥ずかしながら疑問に思ったため記述します。

# SQLとは
`DBを操作する言語`です。
「Structured Query Language」の略
↑(追記)
コメント欄にて、略語ではないという参考サイトと指摘をいただきましたので、
ここで改めて訂正します。申し訳ありません。

Structured = 構造化
Query = 問い合わせ
by Google先生

私は、Rubyを使っているので`rails db:createコマンド`や、
Sequel Pro(シークエルプロ)を使用したデータの書き換えは行ってきました。

これらの操作は、
最終的にSQLという言語が`実行されて実現する仕組み`になっており、
SQLを直接使用せずに、
「特定のコマンドの実行」や「GUI操作」を実現できます。

# SQLによるデータベースの操作
データベースやテーブルに対して命令でき、大きく以下の3つに分類されます。
– `データを定義`「DDL(Data Definition Language

元記事を表示

rails s を実行した際に`Gem Load Error is: AddDllDirectory failed for C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/pg-1.2.3/lib/x64-mingw32`が発生した時の解決方法

#はじめに
Railsで簡単なsnsアプリを作成している際に以下の問題が発生して1日沼にはまったのでそれの過程と、同じようなことが起きても忘れないよう記録として残しておきます。
同じ問題に直面した方々の役に立てれば幸いです。

# 前提・使用環境

・Windows 10
・Ruby 3.0.2
・Rails 6.1.4.1
・Postgresql 12.8

#起きた問題
`rails s`を実行した際に
`Gem Load Error is: AddDllDirectory failed for C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/pg-1.2.3/lib/x64-mingw32`
というエラーが発生。エラーは以下の通り。

“`terminal:コマンドプロンプト
C:/Ruby30-x64/lib/ruby/3.0.0/bundler/runtime.rb:69:in `rescue in block (2 levels) in require’: There was an error wh

元記事を表示

【Rails】いいね/コメント/フォロー/DMの通知機能

#はじめに
通知機能の復習のため残しておきます。

#手順

###前提
いいね/コメント/フォロー/DM機能はそれぞれ作成済みとします。

今回は、

– post(投稿)に対するいいね、コメント
– user同士のフォロー
– フォローユーザー同士であればdm可能

という条件で機能を作成しています。

###やったこと

まず、通知の流れとして、
1.いいね/コメント/フォロー/DMのcreate時に、独自のメソッドで通知を作成
2.独自のメソッドが定義されているモデルへ行き、指定された処理を行う

いいね、コメント、フォロー、DMの順で記します。

###いいね通知

“`ruby:favorite_controller.rb
@post = Post.find(params[:post_id]) #いいねをする投稿を探す
favorite = current_user.favorites.new(post_id: @post.id) #いいねを作成
favorite.save
@post.create_notification_favorite!(current_user)

元記事を表示

railsチュートリアル第6章 ユーザーオブジェクトを作成する

###ユーザーオブジェクトを作成する
Railsコンソールを使ってデータモデルを調べてみましょう。
データベースを変更したくないので、コンソールをサンドボックスモードで起動します。

“`
buntu:~/environment/sample_app (modeling-users) $ rails console –sandbox
Running via Spring preloader in process 13943
Loading development environment in sandbox (Rails 6.0.3)
Any modifications you make will be rolled back on exit
>>
“`
コンソールをサンドボックスで起動すると、そのセッションで行ったデータベースへの変更をコンソールの“`終了時にすべて “ロールバック”(取り消し)“`してくれます。

User.newで新しいユーザーオブジェクトを生成しましたが、リスト 4.17のexample_userファイルを明示的にrequireするまでこのオブジェク

元記事を表示

railsチュートリアル第6章 modelファイル

###modelファイル
Userモデルの作成によって“`どのようにマイグレーションファイルが作成されるか“`を見てきた。

usersテーブルを作成することで、development.sqlite3という名のファイルを更新し、id、name、email、created_at、updated_atを作成しました。

この節では、以後このモデル用ファイルを理解することに専念します。

app/models/ディレクトリにある、user.rbに書かれたUserモデルのコードを見てみましょう。
####生成されたばかりのUserモデル

“`rb
class User < ApplicationRecord end ``` ```class User < ApplicationRecord```という構文で、Userクラスは```ApplicationRecord```を継承する Userモデルは自動的に```ActiveRecord::Baseクラスのすべての機能を持つ```ことになります ActiveRecord::Baseに含まれるメソッドなどについて```知らなければ何の役にも

元記事を表示

OTHERカテゴリの最新記事