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

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

【初心者向け】Railsに出てくるsessionとは??

## 書いた理由
Railsの学習をしていて、sessionの使い方が分からなかったため記事にまとめてみました。
プログラミング初学者のため、間違えていることがあるかもしれません。ご容赦ください?

## 環境
mac m1
Ruby 3.0.1
Ruby on Rails 6.0.3

## sessionとは?
sessionとは主にログイン機能に使用されるもので、ログイン状態を維持させるものです。つまり、ステートフルな通信を実現させるための仕組みとなります。

## sessionを使ってみよう!
1. sessionに値を保存する
セッションはハッシュと同じようにキーとバリューの組み合わせで値を保存します。

“`
session[:user_id] = user.id
“`

1. sessionの値を削除
デリートメソッドの引数にキーを与えて、該当する要素を削除します。

“`
session.delete(:user_id)
“`
結果的にsessionの中身はnilとなります。

## 注意!
sessionは基本

元記事を表示

ActiveRecord 命名規則

rails c を行い、コンソールでモデル名.createでテーブルに保存がされていました。

“`
2.3.0 :001> Blog.create(title: ‘タイトルA’, content: ‘内容A’)
(0.2ms)BEGIN
SQL (0.8ms)INSERTINTO “blogs” (“title”, “content”, “created_at”, “updated_at”)VALUES ($1, $2, $3, $4) RETURNING “id” [[“title”, “タイトルA”], [“content”, “内容A”], [“created_at”, “2017-07-17 05:44:06.209381”], [“updated_at”, “2017-07-17 05:44:06.209381”]]
(3.0ms)COMMIT
=>#

元記事を表示

Rails iframeでサクッと作る地図機能

地図機能を調べると結構な割合でGoogleのAPIがヒットしますが
もっと楽に作れたので、共有です?

# 地図機能 作り方
1. iframeの準備
1. railsのViewで代入

この手順で終わりです!!

# 1. iframeの準備
今回使用するiframeはこちらになります。
“`html

“`
このiframeをカスタマイズしたり、パラメータ(URLのところに出てくるクエリ的なもの)を
いじったりして作成します!

## パラメータの解説
今回使用するGoogleMapのパラメータは以下のようになっています

RailsのER図をMermaid.jsでいい感じに生成する

![](https://storage.googleapis.com/zenn-user-upload/76818a3f6d7d-20221010.png)

**Rails Mermaid ERD**という、Ruby on RailsアプリからMermaidのERDを自由に起こせるGemを作りました。ただERDを生成するだけでなく、共有のしやすさを考慮して作っています。

↓直感的に触れると思うのでデモサイトから触ってみてください。
https://koedame.github.io/rails-mermaid_erd/example.html

ソースコードはGitHubで公開しています。
https://github.com/koedame/rails-mermaid_erd

## 使い方

使い方はインストールしたらコマンドを実行するだけです(詳しいインストール手順は記事の最後に書いています)。

“`bash
$ bundle exec rails mermaid_erd
“`

コマンドを実行すると `./mermaid_erd/index.html` が生成されるの

created_atとupdated_atの表示を変更する方法

# created_atとupdated_atを日本時間へ変更する方法

config/application.rbに以下のコードを記述する

“`config/application.rb
config.time_zone = ‘Tokyo’
“`

“`config/application.rb
require_relative ‘boot’

require ‘rails/all’

# Require the gems listed in Gemfile, including any gems
# you’ve limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module App名
class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defa

シンプルな例で体感するHotwire (2)Turbo StreamsでHTMLをCRUDする

Hotwireの機能のうち、Turbo StreamsもTurbo Frames([前の記事でまとめました](https://qiita.com/shinsuke-kuroki/items/c0cfcdd17c6909a906a3))と同じくページの一部のHTMLによるページの部分更新を実現したものですが、Turbo StreamsはデータでいうCRUDにあたる、内容の追加・更新・削除をしやすくしてあります。こちらも見てみましょう。

– Railsでの用例の話をします
– 記事の読者はRailsの基礎は知っているものとします
– Rails7.0.4 + Ruby3.1.2 で動作させています

## おおまかな流れ

HTTPに載せて使用する場合は、[Turbo Framesのおおまかな流れ](https://qiita.com/shinsuke-kuroki/items/c0cfcdd17c6909a906a3#%E3%81%8A%E3%81%8A%E3%81%BE%E3%81%8B%E3%81%AA%E6%B5%81%E3%82%8C)と同じく、サーバーがレスポンスで返してきた

シンプルな例で体感するHotwire (1)Turbo FramesでHTMLの部分更新

Hotwireにはいくつかの機能がありますが、まずはとても効果がわかりやすいところとしてTurbo FramesでHTMLを部分更新できるので、これを見てみましょう。

– Railsでの用例の話をします
– 記事の読者はRailsの基礎は知っているものとします
– Rails7.0.4 + Ruby3.1.2 で動作させています

## おおまかな流れ

まずは概要を頭に入れて、流れをイメージしやすくしましょう。

以下は、

– 基本的なRailsアプリ
– Rails+JS(Reactなど)アプリ
– Rails+Turbo Framesアプリ

の3つの、処理の違いをシーケンス図に表したものです。(PlantUMLで書きました)

“`plantuml
@startuml
participant “Rails Server”
participant Browser

group 基本的なRailsアプリの典型的な動作
Browser -> “Rails Server”: リクエストを送る
activate “Rails Server”
“Rails Server”

RSpecを読む、駆け出しエンジニア。

## 駆け出し歴、1年5ヶ月
Railsで開発を行っている駆け出しエンジニアです。
RSpecでのテストを書いているのですが、自身がテストを書くときに意識している **文脈** について
共有したいと思い記事にしました。

駆け出したばかりの頃の自分へ向けた内容になっています :walking_tone1:

## 例とするテストコード
下記のようなテストコードがありました。
今日はこれを日本語で読んで行きたいと思います。

“`rb
describe “drink?” do
subject { UniversityStudent.new(age: age).drink? }

context “19歳の場合” do
let(:age) { 19 }

it “お酒を飲んではいけないこと” do
expect(subject).to be_falsey
end
end

context “20歳の場合” do
let(:age) { 20 }

it “お酒を飲んでもいいこと” do
expect(sub

【Ruby on Rails】booleanで実装するときとenumを使うときの違いは?(データ型一覧有り)

# はじめに
Ruby on Railsでポートフォリオ作成にあたりテーブル定義書を作成したが、booleanで実装するときとenumを使うときの違いがわからなかったため調べた結果を記録に残しておく。
また、今後のためにデータ型はどんなものがあるのか一覧にしておくことで、調べる時間の短縮を図る。
(実際に何度も実装する内によく使うデータ型は自然と覚えていくと思うが、現時点ではそのレベル感には到達していないため、記録に残しておきます。)

# データ型一覧

– string : 文字列(1 〜 255文字)
– text : 長い文字列(1 〜 4,294,967,296文字)
– integer : 整数型(4バイト)
– bigint : 整数型(8バイト)
– float : 数値(浮動小数点数)
– decimal : 固定長整数型(精度の高い小数)
– datetime : 日付と時刻(1000-01-01 00:00:00.000000 〜 9999-12-31 23:59:59.999999)
– time : 時刻 (-838:59:59 〜 838:59:59)

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 |