Rails関連のことを調べてみた2022年10月11日

Rails関連のことを調べてみた2022年10月11日
目次

Railsでカラムにnull制約を後から設定する

# 目的
Postテーブルにある既存のtitleカラムに“`null:false“`を追加すること

# 設定方法
### migartionファイルの作成
“`ruby
$ rails g migration ChangePresenseTitleOfPosts

create db/migrate/20221008061033_change_presense_title_of_posts.rb
“`

### migrationファイル追記
“`20221008061033_change_presense_title_of_posts.rb
class ChangePresenseTitleOfPosts < ActiveRecord::Migration[7.0] def change change_column :posts, :title, :string, null: false end end ``` ### データベース反映 ```Ruby rails db:migrate ``` # まとめ 書き方としては ```ruby chang

元記事を表示

【個人開発】テクノロジーをピラミッド構造で整理するアプリ「Technology Pyramid」を作りました

>どうもaono1234と申します。記事がいいなと思ったら是非twitterフォローもよろしくお願い致します❗❗

初めてのオリジナルアプリ【Technology Pyramid】(以下、TechP)ver 0.1をリリースすることができました。???
感無量です?
url: https://technology-pyramid.herokuapp.com/
github: https://github.com/TakeshiAono/technology_pyramid

今回の記事はTechPの概要説明です。良ければプロトタイプですが使用してみて下さい。

:::note warn
次の記事で
– 企画過程
– 設計思想
– 要件定義
– バックエンドの実装について
– フロントエンドについて
について詳しく書きたいと思っています。おたのしみに?
:::

## 1. TechP概要説明
### 1-1. Why?
皆さんは何か新しい技術を学ぶ際、このような事を感じたことはないでしょうか?
– 何が書いてあるの

元記事を表示

takeメソッドについて

### takeメソッド
先頭から任意の数の要素を取得
使い方は下記の通り。

(%w使用し、配列の要素をスペースで区切り配列を作成する)
“`
irb(main):040:0> %w(Ruby Python Java C Smalltalk Brainfuck)
=> [“Ruby”, “Python”, “Java”, “C”, “Smalltalk”, “Brainfuck”]
“`

(takeメソッドで先頭から3つの要素を取得)
“`
irb(main):041:0> %w(Ruby Python Java C Smalltalk Brainfuck).take(3)
=> [“Ruby”, “Python”, “Java”]
“`

元記事を表示

Migrationファイル 備忘録

# Migrationファイルとは?
データベースの設計図の役割を持つ。
例えばroomsというテーブルに、nameというカラムを追加して下さいねと記述。
作成したmigrationファイルは rails db:migrateで実行する。

# Migrationファイル中身詳細
“`ruby
#class Createテーブル名でMigrationファイルを定義
#[7.0]はRails7系を使っていることを示す
class CreateRooms

元記事を表示

enumで実装したラジオボタンのRspec

# 概要
次のようなラジオボタンのどちらかを選択して、
スクリーンショット 2022-10-09 17 04 34
「宣言する」を押すというところまでのRspecを作成しました。
スクリーンショット 2022-10-10 21 45 38
ラジオボタンの作成につきましては、私の前回の記事を参照いただけますと幸いです。

https://qiita.com/gogoserver578/items/2b5d13f62843b2158dc9

こちらのcapybaraの

元記事を表示

【Ruby】ファイルのタイムスタンプを参照したい時

# 概要 
内容が更新されていた場合のみファイルを処理したいなど、
タイムスタンプ情報を元にしてファイルを処理したい場合などがあります。
その場合は、
`File.mtime`メソッド,`File.atime`メソッド,`File.ctime`メソッド
を使って取得することができます。

## 使用例

| 定義 | 動作 |
| —– | —- |
| File.mtime | 最終更新時刻を返す。 |
| File.atime | 最終アクセス時刻を返す。 |
| File.ctime | 状態が最後に変更された時刻を返す。状態の変更とは chmod などによるもの |

### File.mtime
“`ruby
File.mtime(__FILE__) # => 2017-12-03 03:16:22 +0900
“`

### File.atime
“`ruby
File.atime(__FILE__) # => 2017-11-28 22:38:44 +0900
“`

### File.ctime
“`ruby
IO.write(“testfi

元記事を表示

【Ruby】ファイル名がパターンにマッチするか調べたい時

# 概要 
File.fnmatchメソッドを使用すると、与えられたファイル名がパターンにマッチするか確認できます。
特定のファイル名のみ受け付けるなどの処理に有効です。(特定の文字から始まるファイル名しか受けつけないなど)

## 記載方法
* fnmatch(pattern, path, flags = 0) -> bool
* fnmatch?(pattern, path, flags = 0) -> bool


“`ruby
%w(foo foobar bar).each {|f|
p File.fnmatch(“foo*”, f)
}
# => true
# true
# false

p File.fnmatch(“ruby*”, “rubytest.txt”) # => true
p File.fnmatch(“ruby*”, “javatest.txt”) # => false
“`

## 注意事項
パターンで使用できるワイルドカードの一覧は以下の通りです。
正規表現ではないため注意が必要。

| 指定方法 | 動作 |
| —–

元記事を表示

Ruby on Railsの基本概念【基礎】

# Ruby on Railsの基本概念1[DRY]
Ruby on Railsの基本概念の1つ目はDRY(Don’t Repeat Yourself)です。
これは同じ情報を繰り返さないという考え方になります。
つまり、同じコードは繰り返し記述しないことが、Rubyで守るべき1つ目のルールになります。
このルールを守ることによって、コードの修正が必要になった際に、何箇所もある同じような記述を一つづつ修正していくのではなく、まとめた1箇所を修正するだけで済むので、保守・管理がしやすくなります。

# Ruby on Railsの基本概念2[CoC]
2つ目がCoC(Convention Over Configuration)です。
これは設定よりも規約を優先するという考え方です。
個々の開発者がそれぞれ違った設定を持ち、違った規約の下で開発をおこなっていれば、途中から参加した開発者は混乱してしまいます。
そういった事を防ぎ、効率的な開発を行うために、ファイル名の命名方法やRailsで既に定義されている処理をしっかりと守る事で、開発者同士の共通認識がはっきりとし、効率的に開発を進められま

元記事を表示

Ruby on RailsでQiitaエディターみたいなマークダウン機能を作る。TOC、ライププレビュー、ファイルアップロード、ファイル名、コピーボタンなど全て対応!

こんにちは。ずっと前からQiitaのエディターみたいなマークダウンエディターを作りたかったです。
今回はRailsアプリケーションでマークダウンが使えるまでの実装をご紹介いたします。jQueryは使いません。この記事の内容は以下になります。

– マークダウンの導入
– TOC (Table of contents)
– コードブロックのテーマの設定
– コードブロックの上にファイル名の表示
– コピーボタンの実装
– ライププレビュー
– ファイルアップロード
– アップロードの前に画像を圧縮したりリサイズしたりする

結果はこのようになります。

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35605/792a9929-0cea-d0ca-aa88-5a0309f3f27c.gif)

**では、始めましょう!**

# マークダウンの導入

### まずは必要なGemをインストールする

“`ruby:Gemfile
gem ‘redcarpet’ # Markdown parser

元記事を表示

【Ruby】ファイルのパスからファイル名とディレクトリを分割したい

# 概要 
ファイルのパスからファイル名とディレクトリを分割する方法をメモ。

## ファイル名のみ取得する場合

パスから一番後ろのスラッシュに続く要素を取得するには、File.basenameメソッドを使用します。
第1引数でファイル名を表す文字列を指定します。
第2引数でサフィックスを文字列で与えます。’.*’ という文字列を与えた場合、’*’ はワイルドカードとして働き ‘.’ を含まない任意の文字列にマッチします。


“`ruby
p File.basename(“ruby/ruby.c”) #=> “ruby.c”
p File.basename(“ruby/ruby.c”, “.c”) #=> “ruby”
p File.basename(“ruby/ruby.c”, “.*”) #=> “ruby”
p File.basename(“ruby/ruby.exe”, “.*”) #=> “ruby”
p File.basename(“ruby/y.tab.c”, “.*”) #=> “y.tab”
“`

## 対象が存在するデ

元記事を表示

Graphql(graphql-ruby)でネストした関連テーブルをincludesするとキャッシュがきかずN+1になってしまう件について

# Graphql(graphql-ruby)でネストした関連テーブルをincludesするとキャッシュが効かずN+1になってしまう件について

## 結論
railsのincludesを使ってネストした関連をキャッシュしていても、has_many through関連を使用して関連テーブルを取得しようとするとクエリを発行してしまう。
例: `User.includes(user_tags: :tag).where(user_tags: {tag_id: tag_id})`

userから直接has_many through関連先を取得せず、中間テーブルを経由して取得するようにする
例:
“`ruby
user.tags ❌
user.user_tags.map(&:tag) ⭕️
“`

## テーブル構成

このようなテーブルがあったとします。
・usersテーブル
| id | name |
| —- | —- |
| 1 | 太郎 |
| 2 | 花子 |

・user_tagsテーブル(中間テーブル)
| id | user_id |

元記事を表示

[Rails] 本番環境でrails db:dropする

AWS(EC2)へデプロイ後にデータベースを破棄しようとした際に発生
“`
ec2-user@ip-*** ~]$ docker exec -it ***** sh
# rails db:drop RAILS_ENV=production
rails aborted!
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your ‘production’ database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
/usr/local/bundle/gems/activerecord-6.1.5/lib/active_record/tasks/database_tasks.rb:63:in `check_protected_enviro

元記事を表示

Ruby on Rails 7にFont Awesome 6を導入

## importmapを使う場合

“`
./bin/importmap pin @fortawesome/fontawesome-free @fortawesome/fontawesome-svg-core @fortawesome/free-brands-svg-icons @fortawesome/free-regular-svg-icons @fortawesome/free-solid-svg-icons
“`

## yarnを使う場合

“`
yarn add @fortawesome/fontawesome-free @fortawesome/fontawesome-svg-core @fortawesome/free-brands-svg-icons @fortawesome/free-regular-svg-icons @fortawesome/free-solid-svg-icons
“`

## アプリケーションに導入する

“`js:application.js
import { fas } from ‘@fortawesome/free-soli

元記事を表示

enumを使用してラジオボタンを実装する[Rails]

# はじめに
enumを使用して、以下のようなラジオボタンを実装しました。実装するまで理解に時間を要してしまった部分もありましたので、備忘録として投稿させていただきます。
スクリーンショット 2022-10-09 17 04 34
# 開発環境
– OS:Amazon Linux2
– Rails 6.1.6.1
# enumについて
 enumは、数値に意味を持たせることができます。
例えば、enumを導入せずに、integer型のフィールドで次のようにフォームを作成するとします。
“`:
<%= f.radio_button :achieve_status, 0 %> 未達成
<%= f.radio_button :achieve_status, 1 %> 達成
“`
すると、modelやviewファイル等で`ach

元記事を表示

【Ruby】Loggerライブラリを使用して一定サイズごとにログファイルを記録したい

# 概要
一定のサイズごとにログファイルをローテートする場合には、
引数でローテーションするファイル数とサイズを指定する。
例えば5つのファイルを使い、1000バイトごとにローテーションさせる場合は以下のように指定する。

“`ruby
logger = Logger.new(‘test.log’, 5, 1000) #5つのファイルを使い、1000バイトごとにローテーション
“`

第2引数がローテートするファイル数、第3引数が1ファイルごとのサイズを指定できます。
上記の指定ですとログファイルが最新のものを除いて新しいものから順に番号が割り振られます。

* 作られるログ
“`log
test.log
test.log.0
test.log.1
test.log.2
test.log.3
“`

# 参考

https://docs.ruby-lang.org/ja/latest/library/logger.html

元記事を表示

Railsフォロワーのみに通知を送る

# 概要
先日、こちらの記事
https://qiita.com/nekojoker/items/80448944ec9aaae48d0a
を参考にさせていただき、通知機能を実装いたしました。
私のポートフォリオの中で、ある宣言(announcement)を行う機能があります。その宣言を、「フォロワー全員」に通知する機能を実装しました。
自分の勉強の一環として、アウトプットさせていただいております。

# ER図
スクリーンショット 2022-10-08 21 52 41

Announcementが、私のポートフォリオで実装した宣言機能のためのモデルになります。
## 通知モデルの作成
まず、Notificationモデルを作成します。
“`
$ rails g model Notification
“`
続いて、マイ

元記事を表示

rails db:migrateが”Mysql2::Error: Duplicate column name ‘~’”で失敗した際の対応法

はじめに

実装している途中にDBテーブルに外部キーを追加する必要がありました。
いつものようにmigrationファイルを作成し、rails db:migrateを行ったところ下記のエラーメッセージが返ってきました。
~~~
~ # bundle exec rails db:migrate
Running via Spring preloader in process 1242
== 20221007040407 {migrationファイル名}: migrating ===============
— add_reference(:テーブル名, :カラム名, {:null=>false, :foreign_key=>true})
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Duplicate column name ‘{追加したかったカラム名}’
~~~

原因がよくわからず、エラー解消まで少し時間がかかったので備忘録として

元記事を表示

[rails6 devise]. No route matches [GET] “/users/sign_out”の対処法

“`php:view
<%= link_to "ログアウト", destroy_user_session_path, method: :delete %>

↓ method: :deleteを method: :getに変更
<%= link_to "ログアウト", destroy_user_session_path, method: :get %>
“`

次にdevise.rbで「delete」から「get」に変更。
“`php:devise.rb
config.sign_out_via = :delete

config.sign_out_via = :get
“`

railsを再起動したら解決しました。

元記事を表示

Ruby on Rails 部分テンプレートが開かない!!「ActionView::MissingTemplate」のエラーが出ている。。

# 1.はじめに
Ruby on Railsにて部分テンプレートを実装している最中にエラーが発生しました。
同じミスをしないよう、解決方法を記録に残しておきます。

# 2.前提条件
#### 開発環境
Ruby:ruby 3.1.2
Rails:Rails 6.1.6.1
OS:Windows11 Home

#### 実装状況
・deviceを導入し、ログイン機能実装
・ゲストログイン機能実装
・投稿機能実装(投稿一覧、投稿詳細ページ作成)
・会員詳細画面実装
・コメント機能実装
・コメント機能の非同期通信 ←今ココ

#### やりたいこと
コメント機能を非同期通信にするために、まずはコメント投稿フォームとコメント一覧をそれぞれ部分テンプレート化したい。

# 3.エラーメッセージの内容

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823804/e74ec9b8-705c-d699-aceb-8cae21ce344e.png)

元記事を表示

[Rails] ヘルパーメソッドのlink_toを用いたときのclassの書き方

# .htmlでのclassの書き方
“`html:hoge.html

HOGE

“`
# .html.erbでのclassの書き方
“`erb:hoge.erb
<%= link_to 'HOGE', root_path, class: "hoge" %>
“`
※root_pathのところは遷移させたい場所です。

元記事を表示

OTHERカテゴリの最新記事