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

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

【RSpec】例外処理が発生することをテストしたいときに気をつけること

例外処理が発生することをテストするときは“`()“`ではなく
ブロック“`{}“`で捉える

“`ruby
expect{ instance.method }.to raise_error(RuntimeError)
“`

##参考

https://qiita.com/jiz/items/0cd302bb16ce55d231cb

元記事を表示

【Rails】例外処理raise

##環境
Ruby 3.0.2
Rails 6.1.4.1

引数にメッセージのみ指定すると初期値のRuntimeErrorが発生する

“`ruby
raise ‘error message’
“`

第1引数に例外クラス、第2引数にエラメッセージを指定できる

“`ruby
raise NoMethodError, ‘error message’
“`

##参考

Ruby on Railsのraiseの使い例外を発生させる方法を現役エンジニアが解説【初心者向け】

https://mgmmy.hatenablog.com/entry/2019/12/01/232019

元記事を表示

【初心者向け】Railsのビューでエラーが表示されない・レイアウトが崩れる

###■環境
・Windows10(64bit)
・Ruby 2.7.4
・Rails 5.2.6
・devise 4.8.0
###■Railsのビューでエラーが表示されない
####状況
Railsアプリケーションにgem「devise」をインストールし、ビューは「users」ディレクトリ内に格納するようにした。
(デフォルトの app\views\devise ではなく app\views\users に)
そして、ビューのフォームを「form_for」から「form_with」に書き換えるなどカスタマイズした後から、ユーザ情報更新時などにビューでエラーメッセージが何も表示されなくなった。
####原因
1)「form_with」内に「local: true」を追加していなかった。
2)renderメソッドでのリソース指定を修正していなかった。
####対処
1)local: trueの追加

“`app\views\users\registrations\edit.html.erb
#修正前
<%= form_with(model: resource, scope: reso

元記事を表示

FactoryBotを導入

#①.FactoryBot

インスタンスをまとめることができるGemです!

他のファイルであらかじめ各クラスのインスタンスに定める値を設定しておき、各テストコードで使用します!

FactoryBotはGemとして提供されています!

Gemの導入を行います!

#Gemfileを編集

Gemfileを以下のように編集します!

この時も、group :development, :test doの中に記述するように注意してください!

“`php:Gemfile
group :development, :test do
# Call ‘byebug’ anywhere in the code to stop execution and get a debugger console
gem ‘byebug’, platforms: [:mri, :mingw, :x64_mingw]
gem ‘rspec-rails’, ‘~> 4.0.0’
gem ‘factory_bot_rails’
end
“`

記述後にbundle installを実行します!

`

元記事を表示

Railsのフォームのパターン

Railsアプリケーションで作るフォームは、入門書に載っているような書き方だけとは限りません。実際のアプリケーション開発では、入門書以外のパターンを使うことがあります。既存のアプリケーションに新しいフォームを加えるとき、既存のフォームを改修するときは、「どのパターンなのか」をはっきり意識するようにしましょう。

なお、ここでは作成・更新フォーム(POST、PATCHで送るフォーム)だけ取り上げます。検索フォームのようにGETで送るフォームは別の機会に。

フォームに関するその他の記事:

– [バリデーションのエラー表示をなるべく出さない](https://qiita.com/kazutosato/items/141d9880097fd51d7a37)
– [Rails+Vue.jsによるフォームの作例](https://qiita.com/kazutosato/items/38caffdbd21508a5c126)
– [フォームでdata-remote=”true”を使うには](https://qiita.com/kazutosato/items/1661a249220e2870b

元記事を表示

【ruby on rails 】Google Natural Language APIを追加導入し感情スコアを表示。

文章を投稿できる既存アプリにGoogle Natural Language APIを追加導入し
感情スコアを画面上に表示させます。

#1.前提条件、前準備

APIを使用するための前準備(概要だけ記載)
①google側準備

・Google Cloud Platformに登録
・新しいプロジェクトを作成
・APIキーを生成
・Vision APIの有効化

②rails側準備

・gemfile に dotenv-rails 追加
・envファイルに生成したAPIキーを記載
・Google Cloud Vision APIを呼ぶためのライブラリを作成
  ※「lib/vision.rb」作成
・Google Natural Language APIを呼ぶためのライブラリを作成
  ※「lib/language.rb」作成
・自作したライブラリを読み込む
※「config/application.rb」に追記

#2.変更前状態

文章を新規投稿・更新できる、postモデルが存在。
以下はposts_controllerのファイル

元記事を表示

to_i(num)がつまづいた件

RubySilverの勉強中疑問に思ったことがあったので備忘録として記していきます。

##to_s と to_i 使い方
to_s => 数値を文字列に変換
to_i => 文字列を数値に変換

“`ruby:例
n = 8 
puts n.to_s #文字列に変換
# => 8

n = “8”
puts “8”.to_i # 数値に変換
# => 8
“`

##to_s と to_i に引数を設定
to_s と to_i に引数を設定することで基数を変えることができます。
to_s にも使えることは少し驚きでした。
下記の1つ目の例を解説すると
**10進数**の8を**2進数**で表すという処理を行っています。

2つ目は**2進数**の8を**10進数**で表すという処理を行っています。
2進数は0と1で表すので無視されます。よって、0が出力されます。

3つ目は**2進数**の100を**10進数**で表すという処理を行っています。
ここで100は百ではなく100という文字列であることに注意してください

“`ruby:例
n = 8
puts n.to_s(2)

元記事を表示

Railsで子モデルの所有数ランキングを取得するスコープの書き方

個人開発で必要になったのですが、どこにも書いておらず調べるのが大変だったので残しておきます。

“`ruby:app/model/parent.rb
class Parent < ApplicationRecord has_many :children, dependent: :destroy scope :how_many_children, -> { joins(:children).group(“parent.name”).order(count_all: :desc).limit(3).count }
# => {“親名”=>子テーブル所有数(一位), “親名”=>子テーブル所有数(二位), “親名”=>子テーブル所有数(三位)}
end
“`

今思えば[これ(Railsガイド)](https://railsguides.jp/active_record_querying.html#%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E9%A0%85%E7%9B%AE

元記事を表示

railsチュートリアル 第13章 マイクロポストのサンプル

###マイクロポストのサンプル
####サンプルデータにマイクロポストを追加する
db/seeds.rb

“`rb
# メインのサンプルユーザーを1人作成する
User.create!(name: “Example User”,
email: “example@railstutorial.org”,
password: “foobar”,
password_confirmation: “foobar”,
admin: true,
activated: true,
activated_at: Time.zone.now)
# create!は基本的にcreateメソッドと同じものですが、
# ユーザーが無効な場合にfalseを返すのではなく例外を発生させる
# admin:trueにして管理者にする
# サーバーのタイムゾーンに応じたタイムスタンプ

# 追加のユーザーをまとめて生成する
# メイン

元記事を表示

railsチュートリアル第十四章 ユーザーをフォローする

#ユーザーをフォローする
他のユーザーをフォロー(およびフォロー解除)できるソーシャルな仕組みの追加と、
フォローしているユーザーの投稿をステータスフィードに表示する機能を追加します。

ユーザー間の関係性をどうモデリングするかについて学びます
モデリング結果に対応するWebインターフェースを実装していきます。
このとき、Webインターフェースの例としてAjaxについても紹介します。最後に、ステータスフィードの完成版を実装します。

ステータスフィード作成のためにRuby/SQLを「だます」テクニックも含まれます。

これまでよりも複雑なデータモデルを使います。
ここで学んだデータモデルは、今後自分用のWebアプリケーションを開発するときに必ず役に立ちます。

モックアップ
工業製品の設計・デザイン段階で試作される、外見を実物そっくりに似せて作られた実物大の模型のこと。

##Relationshipモデル
ユーザーをフォローする機能を実装する第一歩は、データモデルを構成することです。

“`
git checkout -b following-users
“`

“`
ubun

元記事を表示

railsチュートリアル第13章 マイクロポストを表示する

##マイクロポストを表示する
ユーザーのshowページで直接マイクロポストを表示させる
最初に極めてシンプルなERbテンプレートを作成します。
サンプルデータ生成タスクにマイクロポストのサンプルを追加して、画面にサンプルデータが表示されるようにしてみます。

###マイクロポストの描画
Micropostのコントローラとビューを作成するために、コントローラを生成しましょう。

“`rb
ubuntu:~/environment/sample_app (user-microposts) $ rails generate controller Microposts
Running via Spring preloader in process 3861
create app/controllers/microposts_controller.rb
invoke erb
create app/views/microposts
invoke test_unit
create test/controllers/mic

元記事を表示

railsチュートリアルMysql化とDocker化

今回、下記の動画を参考にしつつRailsチュートリアルのプロダクトをDocker化させてみました。

Docker超入門講座 合併版 | ゼロから実践する4時間のフルコース
[https://www.youtube.com/watch?v=lZD1MIHwMBY&t=3538s](https://www.youtube.com/watch?v=lZD1MIHwMBY&t=3538s)

railsチュートリアルではデフォルトではpostgresqlが選択されていますが、IT企業で採用されているデータベースはMysqlが一番多いという話を聞いたので変更してみます(上記紹介動画でもmysqlが紹介されております。mysql8系で紹介されておりますが、herokuの無料プランが5系のみとの事なので5系でDBを設定します。)

ただ、M1のMacの場合はDockerでMysqlは、サポートされていないのでMariaDBにした方が良いです。(私はintelのMacとM1のMacを持っているので今回は試験的にmysqlにしてますが、恐らくこの先、新しくプロダクトを作る場合mysqlを選択するなら

元記事を表示

gem ‘date’のReDos脆弱性についての内容と対応の注意点 [CVE-2021-41817]

# 脆弱性の内容

`Date.parse`は、内部でRegexpsを使用しており、その一部は正規表現のサービス拒否に対して脆弱です。
このようなメソッドを信頼できない入力に適用するアプリケーションとライブラリが影響を受ける可能性があります。

## 脆弱性に対する修正内容

この修正により、正規表現を変更する代わりにデフォルトで入力長が最大128バイトに制限されます。
これは、’date’ gemが多くの正規表現を使用しており未発見の脆弱な正規表現がまだ存在する可能性があるためです。
互換性を維持するには次のようにlimitキーワードに明示的にnilを渡すことで制限を取り除くことができますが解析に時間がかかる場合があることに注意してください。

“`ruby
Date.parse(str, limit: nil)
“`
# 脆弱性への対応

日付gemをバージョン3.2.1、3.1.2、3.0.2、および2.0.1以降に更新してください。
`gem update date`コマンドを実行して更新することができます。
bundlerを使用している場合は、Gemfileに以下を追加し

元記事を表示

【Rails】seedファイルについて

## はじめに
今回Railsのアプリを作成中に多くのユーザー情報が必要となったことをきっかけに、
seedファイルを使用したので、備忘録です。
今回はuserの作成をします。devise導入済み。

## seedファイルとは
開発を進めていく中で、データを一件一件登録することはとてもめんどくさいですよね。
そのようなときにseedファイルを作成することで、初期データが作成できます。
大量なユーザー情報等を一気に作成することができるので、とても便利です。

## 導入してみる
簡単なものであれば特別なことは必要なく、ファイルに記述するのみです。
単体であれば

“`db/seeds.rb
User.create!(
email: “test@test.com”,
name: “test1”,
passward: “111111”
)
“`
複数であれば

“`db/seeds.rb
10.times do |n|
User.create!(
email: “test#{n + 1}@test.com”,
name: “test#{n + 1

元記事を表示

kaminariを使用してbootstrap5でCSSを追加する

#はじめに

railsチュートリアルをローカル環境で進めています。
will_pagenate gemを使っていますが、kaminariを使って実装してみようと興味本位でやってみた備忘録です。
こちらの記事を参考にされる方はバージョンにお気をつけください。

#環境
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [arm64-darwin20]
Rails 6.1.4.1
kaminari (1.2.1)
bootstrap (5.1.0)

#前提
bootstrapがアプリ内で使えているものとします。

https://qiita.com/mocomou_/items/95f1be13c9b0aafc422b

bootstrapの導入はこちらでどうぞ。

#①kaminariのインストール

https://rubygems.org/gems/kaminari

こちらからkaminariをインストールします。

これだけだと
![no-CSS-paginate.png](https://qiita-image-store.s3

元記事を表示

Stripeで従量課金、かつ最初の数人は無料というサービスの設計

# はじめに
Stripeで下記のような従量課金の仕様で設計する方法をまとめました。Githubのようにチームメンバーが増えると共に使用量が増える料金モデルです。
もっと良い方法があったら教えて欲しいです。(最後の問題点というところにまとめました)

– 人数に応じて月額課金
– 最初の3人は無料
– 集計月の最大登録人数で課金

# 商品の追加
Stripeのコンソールで商品の追加->新しい料金の追加で下記のように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/f3575f95-3634-72fd-b46c-a9b8fc398d73.png)

これで最初の3人は無料、その後1人増えるごとに500円月額課金する料金体系ができました。
また、課金数量は集計月の最大数量で計算されます。(つまり課金の対象となる人数が増えたり減ったりしても、集計月の中で最大になった時の数が使われます)

似たようなもので数量ベースの料金体系がありますが、この場合数量が増えると最

元記事を表示

文字列の結合の種類

RubySilverの勉強中、文字列の結合のメソッドがいくつか出てきたので備忘録として記していきます。
##文字列の結合
文字列を結合する方法は主に + 演算子とconcatメソッド、<< の3種類あります。 concatと << は破壊的メソッドなのに対し、 + 演算子は非破壊的メソッドです。 ### + 演算子の使い方 ```ruby:例 s1 = Leo s2 = Messi puts s1 + s2 # => LeoMessi
“`

### concatの使い方
“`ruby:例
s1 = Leo
s2 = Messi

s1.concat(s2)

puts s1
# => LeoMessi
“`

### << の使い方 ```ruby:例 s1 = Leo s2 = Messi s1 << s2 puts s1 # => LeoMessi
“`

参考記事
[【Ruby】concatを使って文字列や配列を結合する](https://style.potepan.com/articles/27074.html)

元記事を表示

RSpecの導入と単体テストコードを書く

#①.nicknameに対するバリデーションを設定

サンプルアプリを例として、事前準備します!

実装時においては、nicknameに対してバリデーションを設けていません!

今回はバリデーションに関するテストを実装します!

そこで、「nicknameを入力しないと、ユーザーが登録できない」というバリデーションを設定します!

user.rbを開き、以下のように記述します!

“`php:app/models/user.rb
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_many :eats h

元記事を表示

Macで.devドメインに繋げない場合の対処法

Macのブラウザから `http://lightship.dev` に接続しようとすると403が出たので調べました。
.devドメインがlocalhost(127.0.0.1)を指してたので、以下の手順で解決しました。

### 修正手順

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

`cd /etc/resolver/ && ls`

Enterキーを押したときにエントリ名が表示された場合、これはワイルドカードリゾルバであり、.devドメインへのアクセスのすべての試行を127.0.0.1にポイントしている可能性があります。

これは以下のコマンドで削除できます。

`sudo mv dev dev.ignore`

これで.devドメインにアクセスできます。

元記事を表示

railsチュートリアル第13章 User/Micropostの関連付け

###User/Micropostの関連付け

####マイクロポストがユーザーに所属する関連付け
app/models/micropost.rb

“`rb
class Micropost < ApplicationRecord # ApplicationRecordを継承したモデルが作られます belongs_to :user # userモデルとの間に「1対1」のつながりが設定 # 割り当てる validates :user_id, presence: true # presence これは存在するか # presenceメソッドはオブジェクトが存在すればそのオブジェクトを返し、 # オブジェクトが存在しなければnilを返すメソッドとなります validates :content, presence: true, length: { maximum: 140 } # 最大140文字まで end ``` ####ユーザーがマイクロポストを複数所有する(has_many)関連付け app/models/user.rb ````rb clas

元記事を表示

OTHERカテゴリの最新記事