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

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

【Rails/simple_format】フォームで入力した改行を反映させるヘルパーメソッド

# 状況

* フォームで改行を入力

* 出力時に改行が反映されない

![demo](https://gyazo.com/8629b45baabdb38fc768268d5a525ade/raw)

# 環境

* macOS Catalina 10.15.6

* ruby 2.6.5

* Rails 6.0.3.4

* MySQL : 5.6.47

* Bootstrap : 4.3.1

# 学んだコード

* simple_format : ヘルパーメソッド。改行をpタグやbrタグで表現

* hオプション : XSS対策。simple_formatにエスケープ機能を付与

【参照】

* simple_format | Railsドキュメント

* simple_formatの使い方 | Qiita

元記事を表示

【Rails/Heroku】push後のエラー解消手順

# 状況

* 開発環境でアプリケーションに追加実装 (コメント機能の実装)

* デプロイ先のHerokuにpush

* Heroku上アプリでコメントを投稿しようとしたところエラー

![demo](https://gyazo.com/fe06ac1a3aa02f51465eb94ee18a0310/raw)

# 環境

* macOS Catalina 10.15.6

* ruby 2.6.5

* Rails 6.0.3.4

* MySQL : 5.6.47

# 対処の手順

## 1. ターミナルでログを確認

Heroku上のアプリを操作した際は、ターミナルでコマンドを打つとログを確認できます。

“`terminal
% heroku logs –tail –app アプリ名

# –tailは最後の10行を表示するオプション
“`

実行後、エラー箇所を抜粋したのがこちら。

![demo](https://gyazo.com/6db73fbc980e736c5791c9ab7959016a/raw)

元記事を表示

実は、Rubyは改行と空白を区別しています

「Ruby は改行と空白を区別していない」という話をちらちら見かけます[^space]。
そんなわけないのでして。

[^space]: ここでいう「空白」はいわゆる「半角スペース」(U+0020)のこと。

改行と空白が区別されないなら

“`rb
x = 1 puts x
“`

で `1` が表示されるはずですが,SyntaxError になります。そりゃそうだ。
また,

“`rb
puts
1
“`

で `1` が表示されるはずですが,改行しか出力されません。そりゃそうだ。

Ruby はむしろ改行と空白を区別する言語です。だからこそ文末のセミコロンが省略できるのですね。

# なぜ広まった?

Ruby on Rails チュートリアル 第4版の「4.3.4 CSS、再び」
https://railstutorial.jp/chapters/rails_flavored_ruby?version=5.0#sec-css_revisited
には,

> 実は、Rubyは改行と空白を区別していません

というくだりがあります[^latest]。ここが発信源かっ?!

元記事を表示

【Rails/一意性制約】モデルのバリデーションをコンソールで確認する方法/複数カラムへの一意性制約

# 状況

* userとroomを紐付けるpermissionsテーブル(部屋に入れる許可証を管理)を作成したい

* references型でuser, taskをカラムにもつ

* 既にテーブルに存在する(user_id, task_id)のセットが入力された際、保存しない制約

* このバリデーションが正常に動作するかをコンソールで確認したい

「一意性制約」を使えば実現できるこちらのバリデーション。

今回はこれがちゃんと実装できているか、rails cで立ち上げたコンソールでの操作についての記録です。

# 環境

* macOS Catalina 10.15.6

* ruby 2.6.5

* Rails 6.0.3.4

* MySQL : 5.6.47

# 今回のコード

“`app/models/permission.rb

class Permission < ApplicationRecord belongs_to :user belongs_to :task validates :user_id, un

元記事を表示

【Rails/ルーティング】自作したディレクトリ内のコントローラを参照する方法

# 概要

かんたんログイン(テストユーザーログイン)実装にあたり、普段しない形でコントローラファイルを作成しました。

その際に「え、これどうなってんの?」と感じたことがあったのでそれを記録します。

# 環境

* macOS Catalina 10.15.6

* ruby 2.6.5

* Rails 6.0.3.4

* MySQL : 5.6.47

# 今回やりたいこと

* [URL] localhost:3000/admin/usersにアクセス

* app/controllers/admin/users_controller.rbのindexアクションへルーティング

* index.html.erbを表示

# まず、普通のusersコントローラで動作確認

ターミナルで以下のコマンドを入力します。

“`terminal
% rails _6.0.0_ new controller-app -d mysql

% cd controller-app

% rails db:migrate

% rails g contr

元記事を表示

RSpecにおけるモックとスタブ

参考文献
Everyday Rails – RSpecによるRailsテスト入門
https://leanpub.com/everydayrailsrspec-jp

##モックとスタブ
###モック
テストのために使用される、本物のオブジェクトのフリをするオブジェクトである。
また、テストダブルとも呼ばれる。
モックはデータベースにアクセスしないため、テストにかかる時間は短くなる。

###スタブ
オブジェクトのメソッドをオーバーライドし、事前に決められた値を返す。
スタブは、呼び出されるとテスト用に本物の結果を返す、ダミーメソッドである。スタブをよく使うのはメソッドのデフォルト機能をオーバーライドするケースです。特にデータベースやネットワークを使う処理が対象となる。

##実際に書いていく
Userオブジェクトにあるname(first_name + last_nameの結合)メソッドをNoteオブジェクトにデリゲートして属性追加している。

Userの属性 first_nameとlast_name

Userのnameメソッドで first_nameとlast_nameを結合

元記事を表示

【Rails】twitterログイン導入時にハマったActiveSupport::MessageVerifier::InvalidSignatureの解決方法【ActiveStorage】

現在完成間近の個人開発アプリにtwitterログインを導入したときにかなりハマったので備忘録として解決策をこちらに残しておきます。

#エラー内容
twitter連携したときに、twitterアカウントで設定されている画像をActiveStorageでアタッチして、デフォルトのプロフィール画像に設定するという実装を行ったときに以下のようなエラーが起きました。(もちろん同時にtwitterのアカウント名も引っ張て来てます)

“`
ActiveSupport::MessageVerifier::InvalidSignature
“`

画像に関するコードをコメントアウトしたらエラーが消えたので、ActiveStorageが悪さをしているようでした。

画像のURLで直接アタッチしようとすると、不正な署名?としてActiveStorageから認識されてしまうようです。

#解決策
流れとしては open-uriを使いtwitterの画像をダウンロードして、 ActiveStorageへ直接 IO インスタンスをアタッチするといったイメージです。(多少表現に誤謬がありましたらご指摘いただ

元記事を表示

graphql-ruby: controller内でqueryまたはmutationの名前を取得する方法備忘録

タイトルの通り。

`GraphQL.parse`を使って取得できる。

“`ruby
GraphQL.parase(params[:query]).definitions[0].selections[0].name
“`

もっと良い方法ご存知の方教えてください。

元記事を表示

gem の rake test で特定のファイルだけ実行する方法

既存の記事には見当たらず(探し方が悪いだけかも),リファレンスでも見つけるのが困難だったので記事にする。

gem を開発していて,テストを実行するには,

“`shell
rake test
“`

とすればよい。
おっと,前提条件として,

“`shell
bundle gem hoge
“`

のようにして作った,典型的な構成の gem とする。

特定のテストファイルだけを実行したいときにはどうするか?
以下のようにしてファイルを指定すればよい。

“`shell
rake test TEST=path/to/some_test.rb
“`

このことは Ruby 公式リファレンスの
[class Rake::TestTask (Ruby 2.7.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/2.7.0/class/Rake=3a=3aTestTask.html)
に「test ターゲットの使用例」として書いてあった。
うーん,しかし,このページにたどり着くのはなかなか難しいな。それに「例」として 1 行掲載されているだ

元記事を表示

コマンドの仕組みと管理ツール

#コマンドの仕組みと管理ツール
#目的
* 環境構築で使用したツールとその仕組みを理解すること
* パッケージ管理ツールで管理する理由を理解すること

#シェル
##簡単に言うと「ターミナルとOSを繋ぐ窓口役」のような存在。ターミナルから入力されたコマンドを読み取って、OSに対して指示を渡し、結果をターミナルに返して表示や実行などの動作をさせる
#zsh
##zshはシェルの1つ。ターミナルでecho $SHELLとコマンドを実行すると現在使用しているシェルはzshであることがわかる
#PATH
##「環境変数」と呼ばれるOS用の変数のことです。PATHには、複数の絶対パスの情報が保存されている。コマンドが入力されたときに、シェルはPATHに記述されたパスのディレクトリ内のファイルを検索する。つまり、PATHに絶対パスを保存してアプリケーションのありかを示せば、どこからコマンドを実行してもアプリケーションのコマンドを打つことができる
#コマンドラインツール
##コマンドで操作するアプリケーションのまとまり。コマンドラインツールを導入することで、OSが初めからコマンドで操作できるアプリケ

元記事を表示

RSpecのテストコード実行編

#はじめに
 以前に、RSpecの導入方法やテストコードの書き方については投稿したが、実際のテスト方法については説明していなかったので、今回書いたテストの実行方法について見ていく。

【以前の投稿】
[RSpec導入後、モデルの単体テストコードを書き始めるまで](https://qiita.com/TerToEer_sho/items/2d42c0cdb7a623a32119)

[もう迷わない!RSpec導入の流れ](https://qiita.com/TerToEer_sho/items/472e14df6fbb8e83ebf9)

##書いたテストコードの実行方法

カレントディレクトリが作成中のアプリケーションであることを確認の上、ターミナルで

“`bash
bundle exec rspec spec/models/ファイル名
“`

ファイル名は、実際にテストコードを記述したファイルのこと。

テストがうまくいけば、エラーもなく、examplの項目(日本語で何をチェックしたいか記述している部分)が全て緑色になる。

##binding.pryで止めた場合
“`
%

元記事を表示

デフォルト値付きの引数 Railsチュートリアルのfull_titleメソッドを例に

##対象者
・以下のRailsチュートリアル4章で出てくるfull_titleメソッドの引数(page_title = ”)に違和感がある方
・デフォルト値付き引数について理解していない方

“`
full_title(page_title = ”)
“`

・Railsチュートリアル、チェリー本で学習している方

## 記事の目的
Railsチュートリアル4章のfull_titleヘルパーメソッドの引数(page_title = ”)の部分について理解する。

初学者で勉強のアウトプットもかねてます。間違いがあれば、ご指摘下さい。

##Railsチュートリアル4章で出てくるfull_titleの引数である(page_title = ”)とは?

【リスト 4.2: full_titleヘルパーを定義する】

“`app/helpers/application_helper.rb
module ApplicationHelper
# ページごとの完全なタイトルを返します。
def full_title(page_title = ”)
base_titl

元記事を表示

Ruby メソッドとクラス(基礎)

### 話すこと
1:メソッド
2:クラス
3:インスタンスメソッド
4:クラスメソッド
です。

### 1:メソッドとは
メソッドとは、複数の処理をまとめてくれるもの。

“` greet.rb
def greet(name)
puts “#{name}, HELLO!”
end
greet(‘Alice’)
> “Alice, HELLO”
“`
の **greet(name)** がメソッドにあたる。メソッドは定義されている部分(def ~ end)では読み込まれず、実行されること(greet(‘Alice’))によって初めて読み込まれる。

メソッドは、
1:値を渡せる
2:最後に評価値が返る
3:メソッド内で定義した変数は、外部アクセスできない
という特徴を持っている。

メソッド名が長い場合、スネークケースで書くことが慣習なので、
> greetHerではなく **greet_her**
sendMailではなく **send_mail**

という形で書く必要がある。

#### メソッドを使うメリット
1:メソッドで定義された処理は再利用が出来る
2:コードの

元記事を表示

【Rails】新規プロジェクトを立ち上げる

#はじめに
新規プロジェクトを立ち上げる時にバージョン指定等を行います。
全ての始まりなので丁寧に記録を残しておきます。

####目次
1.新規プロジェクトの立ち上げ
2.データベースを作成
3.GitHubと連携

#1. 新規プロジェクトの立ち上げ

tabiという名称のアプリケーションを作成します。

“`ターミナル.
% cd ~/projects
% rails _6.0.0_ new tabi -d mysql

#……読み込みをしばらく待って。
successfully が表示されれば成功。

% cd tabi
“`
新しくできたtabiアプリに移動します。

#2. データベースを作成
データベースを作成する前に、database.ymlに記載されているencodingの設定を変更します。

“`config/database.yml
efault: &default
adapter: mysql2
#encoding: utf8mb4 ←これをutf8に編集
encoding: utf8
pool: <%= ENV.fetch("

元記事を表示

【Rails5】deviseを用いた際のパスワード変更画面表示方法について

# 概要
Rails5にてdeviseを導入した際、deviseによって生成されるパスワード変更画面をうまく表示させることができないというトラブルに見舞われたため、備忘録として残しておきます。

※初投稿の記事になりますので、分かりにくかったらすみません、、、

# この記事でわかること
– deviseのログイン前後におけるパスワード変更画面の表示方法

# 前提
<使用環境>
ruby 2.5.7
rails 5.2.4

※deviseは導入済みとして進めますので、導入方法については以下の記事等を参考にしてください。
参考ページ:[Deviseの設定手順をまとめてみた。 その1 導入編](https://qiita.com/hakatatech/items/ea0d9236d89fa24a7a1c)

# 表示方法
### deviseのルーティングを確認
devise導入後、コンソール上で「rails routes」コマンドを使ってルーティングを確認すると以下のような形で表示されるかと思います。

“`
$ rails routes
Pr

元記事を表示

Docker+VSCode(Remote Container)によるRuby on Railsの開発環境構築

# はじめに
諸事情により,Webアプリの開発を行うことになったので,DockerとVSCodeを使って,Ruby on Railsの開発環境を構築しました.備忘録として,その記録を残しておきたいと思います.
ちなみに,この方法で構築すると基本的にVSCode内で完結します.いちいちターミナルで,`docker-compose up`して`docker-compose run web rails db:create`と入力する必要はなく,VSCodeのターミナル上で`rails db:create`できます.

# VSCodeのRemote Container(Development)
今回はVSCodeの拡張機能であるRemote Containerを使います.このRemote Containerを使えば,なんとDockerで立ち上げたコンテナの環境にVSCodeでアクセスして,コンテナ内のプログラムファイルをVSCode上で編集やらデバッグやらを実行することができます.ちなみに,似たような拡張機能にRemote Developmentなるものがありますが,これはDockerのコン

元記事を表示

テスト

テストです

元記事を表示

[Rails]お気に入り機能

# 実装したいこと
– クチコミ投稿者以外がお気に入り登録をできる
– Ajax通信でお気に入り機能を実装
– マイページにお気に入り一覧を表示

# 目次
1. お気に入りテーブルの作成
2. アソシエーション
3. ルーティング
4. コントローラー
5. ビュー

# 1. お気に入りテーブルの作成
どの投稿に、誰がお気に入りをしたのかを保存するために、お気に入りのテーブルを作成します。

##### ターミナル
“`
rails g model like
“`

“`ruby:db/migrate/20XXXXXXXXXXXX_create_likes.rb
class CreateLikes < ActiveRecord::Migration[6.0] def change create_table :likes do |t| t.references :user, null: false, foreign_key: true t.references :post, null: false, foreign_key: true

元記事を表示

RailsでCSVダウンロード機能を実装する

### 背景
RailsでCSVダウンロード機能を実装することになりました。すでに簡単で優れた事例はQiita上にたくさん上がっていて、このあたりの記事を見ればさらっと実装できたのですが、

– [【簡単3ステップ】RailsでCSV出力する方法](https://qiita.com/ngron/items/60915083cb2bc3622c79)
– [RailsでCSV出力を行う方法を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/22192)

仕事先で見つけたCSV出力機能はこれらよりもずっと複雑な作りをしていたので、「この仕組みはどうなっているんだ!」と思ったことを調べつつ、実装してみることにしました。基本的には、上記で紹介した2つ目の記事に近いです。

なお、Railsのバージョンは`5.2.4.2`です。

### controller

controllerは上記で紹介した記事とほとんど変わらないです。htmlとcsvでformatを分けて、csvのフォーマットでリクエストがあったときに、csvを作成するメソッドが

元記事を表示

【Rails】DMしたことがある人をマイページに表示して、チャットページにリンクできるようにする!【備忘録】

https://qiita.com/nojinoji/items/2b3f8309a31cc6d88d03

を用いてDM機能を実装した際、チャットページに飛ぶリンクをユーザーの一覧表示ページ以外に実装したい!と思ったことがある方も多いと思います。

そこで、一度DMのやりとりをしたことがある人に関しては、以下の画像のようにユーザーのマイページからチャットを再び再開できるようにしようと思います。(LINEのマイページみたいなイメージですかね)

解説は気が向いたら書きます!

#view/users/show.html.erb

“`
<% if current_user.id == @user.id %>

チャット一覧

<%= @rooms.each do |r| %>
<%= r.users.each do |u| %>
<% if u.id == current_user.id %>
<% else %>

  • OTHERカテゴリの最新記事