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

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

テストコードを書いてみよう③

ここではコントローラーのテストコードを書いていきます。
モデルとコントローラーでは、テストコードを書く方針が以下のように異なります。

|テストコードの種類|テストコードを書く方針|
|—|—|
|モデル|インスタンスを生成し、想定どおりの挙動になるか(バリデーションが正しく働くかなど)を確かめる|
|コントローラー|アクションにリクエストを送ったとき、想定どおりのレスポンスが作られるかを確かめる|

コントローラーのテストコードでは、「リクエストとレスポンス」に着目したテストコードを記述します。

##Request Spec
RSpecが提供している、コントローラーのテストコードを書くために特化した手法です。
RSpecを入れていれば使えます。

ファイルを作成します。

“`
rails g rspec:request tweets
“`

今回は、tweetsコントローラーのindexアクションにリクエストを送ったときの
レスポンスについて確認するコードを記述します。

以下の項目に対してチェックしていきます。

“`
正常にレスポンスが返ってくる
レスポンスに投

元記事を表示

【Ruby on Rails】rails newのときにrailsバージョンとデータベースを指定したい

# rails new railsのバージョン指定、DB指定
railsの新規プロジェクトを作成するときに、rails new [プロジェクト名]でアプリを作成すると思いますが、そのときにrailsのバージョンを指定したい時。

“`
$rails _6.0.3.2_ new todo-app
“`
このようにrails newの間に、railsの使いたいバージョンを追加するとできる。

### databaseをなにを使うか指定したいとき

“`
$rails _6.0.3.2_ new todo-app –database=postgresql
“`
プロジェクト名のあとに“`–database=postgresql“`このようにしてdatabase名を追加する。

元記事を表示

Rails 環境構築が難しい件 エラーが出たらググるしかない

###ローカル環境構築

こちらを参考にVScodeで環境構築を進めた
https://qiita.com/wtrt0417/items/1680c007a9ab4d8e4965

しかし、
サーバーがなぜか立たず
terateilで質問
https://teratail.com/questions/320785
一旦全てフォルダを作り直し、Railsチュートリアル の環境でrails のバージョンを
rails -v
Rails 6.0.3.4
に下げて再度構築したらなぜかできるようになりました。

###本番環境へデプロイ
rails チュートリアルに沿ってherokuでデプロイする

“`
$git push -u origin master
$git push
$git push heroku master
“`

を実行すると以下のエラーが出てくる

“`
Enumerating objects: 122, done.
Counting objects: 100% (122/122), done.
Delta compression using up to 4 t

元記事を表示

[未経験エンジニア]のオリジナルアプリ制作の反省5. local: trueはなぜ書くのか

# 今回書くこと
form_withに記述するlocal: trueはなぜ記述するのか

## 環境
Ruby 2.6.5
Ruby on Rails 6.0.4.3

## 結論
local: trueを記述する理由は、form_withにデフォルトで搭載されているremote: trueを打ち消し、同期通信にするため。

## form_withとは、と少し解説
form_withは、Railsのビューの拡張子としてerbを選択した時に用いる事ができる、フォームを作成するヘルパーメソッドです。ちなみに、ERB(Embedded Ruby)は、htmlやjsといった拡張子の後ろにくっつく事で、rubyのコードを実行できるファイルを生成できます。

Railsガイドによると、
> Action Viewのテンプレートはさまざまな方法で記述することができます。テンプレートの拡張子が.erbであれば、ERB (ここにRubyのコードが含まれます) とHTMLが含まれます。

とのことなので、例えば

“`index.html.erb

このファイルには、rubyのコードを実行できる

元記事を表示

[Rails]Devise で保存されたパスワードを自前で認証したい

#課題
Deviseで保存された暗号化パスワードを自前システム用に認証したい

“`irb:console
irb(main):010:0> user.encrypted_password
=> “$2a$12$vYelOHSlV8xtIfFShoZMIeWoOKVueTDeVQJtyl9JbLQilyLs5h4c.”
“`

#結論
valid_password?(‘string’) を使うと出来た。

“`irb:console
irb(main):011:0> user.valid_password?(‘password’)
=> true
“`

#参考情報
Github devise
https://github.com/heartcombo/devise/blob/master/lib/devise/models/database_authenticatable.rb

元記事を表示

数多くのレコードからランダムに複数件を選ぶのは、あらかじめ絞るのが良い

業務で主に Ruby On Rails での開発を行っていますが、そこで得た知見や、失敗への対応などについて記します。

“`
# 環境
Ruby 2.6.6
Rails 5.2.4.3
Postgres 10.10
“`

## 状況と現状

状況と要件は以下の通りです。

* あるDBテーブル(ここでは `Item` )に、数十万件のレコードがある
* そのうちの 10件をランダムに選びたい

単純な実装としては「SQL の `RANDOM()` でソートして最初の 10件を取り出す」になります。

“`ruby
# Rails の ActiveRecord を利用
Item.order(Arel.sql(‘RANDOM()’)).limit(10)
“`

これを試しに実行すると、以下のように 1000ms ほどの時間がかかります。

“`
Item Load (1029.2ms) SELECT “items”.* FROM “items” ORDER BY RANDOM() LIMIT 10;
“`

これは、この処理が以下のように動作しているからです。

1.

元記事を表示

[2021]Ajax(非同期通信)フォロー機能(Rails・jQuery)

##前提
– フォローボタンを実装していること
– jQueryを使用できるようにしていること

“`View.

<%= render 'relationships/follow_button', user: @user %>

“`
部分テンプレートを使用しているため
お好きなところに使用してください。

##部分テンプレート作成
“`relationships/_follow_button.thml.erb

<% if current_user.following?(user) %>
<%= link_to 'Unfollow', user_relationships_path(user.id), method: :delete, remote: true %>
 <% else %>
<%= link_to 'Follow', user_relationships_path(user.id), method: :post, remote: true %>
<% end %>
“`
– link_toを

元記事を表示

テストコードを書いてみよう②

今まで書いたテストコードはインスタンスを毎回入力して行っていました。
もう少し効率的にテストコードを書いていきましょう。

##FactoryBot
インスタンスをまとめることができるGemです。
他のファイルであらかじめ各クラスのインスタンスに定める値を設定しておき、各テストコードで使用します。
それでは導入しましょう。

“`rb: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
“`

FactoryBotの記述を格納するディレクトリfactoriesと、Userモデルに対するFactoryBotのファイルu

元記事を表示

[Ruby on Rails] サーバー重複時の対処法について

自身の失敗から学んだことを書いて行きます。

まず、**rails s**コマンドで**localhost:3000**を起動中に重たくなって動かなくなったって事ありませんか??

大抵が**control****+****C**を押せば直るんですけど、
その時、直らなくて焦ってターミナルを強制的に切ってしまったんです。
  

すると、新しく開いたターミナルでサーバーが開かなくなってしまいました。
原因は

サーバーが既に起動していたから

サーバーを付けたまま強制終了するとこいう事が起こるらしい。

 
その**解決方法**がこちら
 
 
先ほど新しく開いたターミナルで

lsof -i:3000
 

とコマンドを打つと![スクリーンショット 2021-02-09 0.24.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1078698/3b6b1062-ab7e-cb72-463c-da2042b288f8.png)

こんな感じで先ほど使っていたサーバーの状況を確認

元記事を表示

zipメソッドを使って複数の配列を同時に取り出す

##複数のタグを同時に表示させたかった
タグ付け機能を複数実装し、同じページに表示させようとした際に便利なメソッドを見つけたので備忘録として残しておく。

##zipメソッドの使い方
zipメソッドを使うことで、複数の配列から同時に取り出すことができる。

“`ruby
tag1 = [‘test1’, ‘test2’, ‘test3’]
tag2 = [‘テスト1’, ‘テスト2’, ‘テスト3’]

tag1.zip(tag2) do |tag1, tag2|
puts tag1
puts tag2
end
“`
上記のように記述すると以下の実行結果となる。

“`
test1
テスト1
test2
テスト2
test3
テスト3
“`

元記事を表示

【Rails6】Action Cableによるコメント機能の実装

Rails6で作成したポートフォリオに**Action Cable**を利用したコメント機能を実装しました。
備忘録のため、実装方法を記載します。

# 開発環境
– MacOS Catalina 10.15.7
– Ruby 2.6.5
– Ruby on Rails 6.0.3.4

# Action Cableとは
そもそもAction Cableとは、[Railsガイド](https://railsguides.jp/action_cable_overview.html)によると

> WebSocketとRailsのその他の部分をシームレスに統合するためのもの

とのこと。

**WebSocket**は通信規格の一種。
Webアプリケーションにおいて、クライアント/サーバ間のデータ通信を実現するための規格。
現時点では、**リアルタイムの双方向通信をイイ感じに実現してくれる規格**とでも覚えておきます。

# 今回実装する要件
既存アプリの概要は、記事を投稿・閲覧するアプリ。
今回は既存アプリの詳細画面上で、コメントを入力・閲覧できる機能を実装します。
コメント閲覧は誰でも

元記事を表示

画像投稿でプレビューを表示させる

# はじめに
ユーザーのことを思ってアプリ制作をしようシリーズ第二弾です。
railsでアプリを作り始めたころは画像投稿をする際にファイルを選択した後、ファイル名だけが表示されていることに対してなにも思わなかったんですけど、ある程度経験を積んでいくうちにプレビューがないとすごく不親切なアプリになってしまうということに気がつきました。
なので今回はそのやり方をメモ程度に書き残します。

# 作るもの
### 画像選択前
![スクリーンショット 2021-02-08 15.21.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674324/f37a02b8-c0a7-175b-c5d8-0e53c04f4be7.png)

### 画像選択後
![スクリーンショット 2021-02-08 15.21.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674324/af896acd-f639-a606-1a22-7feb

元記事を表示

Railsアプリで編集機能を実装する

#編集機能の実装
編集機能では、既に登録された投稿の属性の値を変更してDBに保存します。
一覧画面の投稿情報ごとに「編集」リンクが表示され、そのリンクから編集画面へ遷移することにします。
また、詳細画面にも編集ボタンを設けるようにします。

##編集リンクの設置
まずは一覧画面(app/views/posts/index.html.slim)に編集画面へのリンクを設置します。
編集画面はedit_post_pathというヘルパーメソッドにより、post/[投稿ID]/editというURLを生成できます。

“`ruby:app/views/posts/index.html.slim
h1 タスク一覧

= link_to ‘新規投稿’, new_post_path, class: ‘btn btn-primary’

.mb-3
table.table.table-hover
thead.thead-default
tr
th= Post.human_attribute_name(:content)
th= Post.human_attribute

元記事を表示

【AWS】用語を整理しながら学ぶAWS – 番外編-EC2上にRails6環境を構築(一部Terraform利用)

# はじめに

この記事では AWS Cloud Tech を通して IaC を学習して実践していく記事です。
主な内容としては実践したときのメモを中心に書きます。(忘れやすいことなど)
誤りなどがあれば書き直していく予定です。

**※AWS Cloud Tech では CloudFormation が基礎から学習できます。**
**※今回チョットだけ扱う Terraform は AWS Cloud Tech で学習しません。(2021/02/08 Mon 現在)**

**※この記事で紹介する Rails 環境のパラメータ(パスワードやユーザ名、権限)などはご自身の環境に**
**合わせていただくようお願い致します。**

また、今回は一度も使っていませんが
今後はプライベートネットワークにも何かしら置く予定です。

## Terraform とは

HashiCorp 社 が提供する製品の名前
巷で話題のインフラをコード化するということが各クラウドでできます。
今回は AWS を題材に使いますが、Azure,GCP でもできます。

## なぜ、Terraform なのか

私が

元記事を表示

rails 評価機能(数字のみ)

##はじめに
オリジナルアプリ制作過程で評価機能を作ったので健忘録として残します

##1.DBファイル

“`
class CreateEvaluates < ActiveRecord::Migration[6.0] def change create_table :evaluates do |t| t.integer :speedy t.integer :kindness t.integer :frantically t.references :user, foreign_key: true t.timestamps end end end ``` 今回は早さ、親切さ、リピート、総合力の評価をしたかったので3つのカラムを用意しました。 でも総合力無いじゃんと思いましよね?わざわざ作らんでも四則演算できると思ってBDにはカラムとして用意はしませんでした ##2.controller ``` def show @evaluate = Evaluate.new @evaluates =

元記事を表示

【Rails】本投稿アプリ「Bookers」を作成する【ログイン機能】

# はじめに
初学者のアウトプット用、自分用の備忘録となっています。
・aws cloud9
・Rails 5.2.4
・ImageMagickをインストール(ユーザー画像用)
■前回:[Githubとの連携](https://qiita.com/guminatto/items/69a27b5f947c43ece9cd)

今回は、ログイン機能を「devise」を使って追加してみます。
”メールアドレス”、”パスワード”でログイン可能にした後に、”名前”、”パスワード”でログインできるように変更します。

# 事前準備
1.Railsアプリケーションを新規作成

“`ruby:cloud9
$ rails new bookers
$ cd bookers
“`
今回は「bookers」という名前をつけました。(先頭の文字は小文字でOK)
カウントディレクトリを”bookers”に移動しておきます。

詳しく

【$ rails new bookers】
Rails on Rubyにて新規アプリケーションを作成するには「rails n

元記事を表示

【エラー】ActiveRecord::StatementInvalid: Mysql2::Error:

#はじめに

エラーに苦戦したため、解消方法を忘れないように備忘録として記述します。
もし参考になれば幸いです。

# 環境

現在のバージョン:
macOS Catalina 10.15.6

環境
ruby ‘2.5.8’
ruby on rails ‘5.2.2’
docker
MySql 5.7.33

# 背景

新しくgit branchを作成後PCをシャットダウンさせて再度開発をする際にlocalhost:3000でページ確認をしたところ下記エラーが発生。
ActiveRecord::StatementInvalid: Mysql2::Error: Tablespace ‘データベース名.テーブル名’ exists.: CREATE TABLE テーブル名 (version varchar(255) NOT NULL PRIMARY KEY)

調べてみたところ何らかの原因でデータベースの情報に相違があった、壊れているなどが原因とのこと。
ターミナルで下記を実行したが同様エラーで先に進めない

“`ruby:ターミナル
$ docker-compose run

元記事を表示

ProgateのRailsで「We’re sorry, but something went wrong.If you are the application owner check the logs for more information.」が出たときの対処法

ProgateでRailsを勉強している際に、あまり見慣れないエラーメッセージに遭遇しました。
お問い合わせすることなく、解決したので記載します。

症状

エラーの内容は、
「We’re sorry, but something went wrong.If you are the application owner check the logs for more information.」

日本語だと、
「申し訳ありませんが、問題が発生しました。アプリケーションの所有者である場合は、ログで詳細を確認してください。」

スタックトレースなど出ていないため、今回コードに手を入れたところでエラー箇所を類推する必要がありました。

また、特定の画面ではなく、どの画面でもこのメッセージが出てくる模様。

ちなみに、Railsの道場コースⅢの「ログアウト機能を作ろう」で発生しました。

![progate.JPG](https://qiita-image-store.s3.ap-northea

元記事を表示

railsでフォームに入力された文字数をカウントする方法(jQueryなし)

# 開発環境
Mac OS Catalina 10.15.7
ruby 2.6系
rails 6.0系

# 前提

– 投稿フォームのビューは実装済み

– JavaScriptのフレームワーク等は使っていません

# ビューにIDを付与する

まずはビューにIDを付与していきます。
IDを付与する要素は2箇所で、文字数を出力する要素と、文字数をカウントしたいフォームの要素に付与していきます。

“`new.html.erb

写真のタイトル
必須
# IDを付与
0文字

# IDを付与
<%= f.text_area :title, id:"post_text", placeholder:"タイトル(必須 40文字まで)", maxlength

元記事を表示

テストコードを書いてみよう

つぶやきアプリを使ってテストコードを書いてみましょう。

##テストコード
アプリケーション内に記述する、そのアプリケーションの挙動を確認するためのコードのことです。

##RSpec
Ruby on Railsのテストコードを書くために用いられるGemです

アプリケーションの挙動を確認するときは、「うまくいくとき」「うまくいかないとき」をそれぞれ確認する必要があります。
それぞれ正常系と異常系と言います。

##正常系
「ユーザーが開発者の意図する操作を行った時の挙動」を確認するテストコードが、正常系に分類されます。
新規登録する時に必須項目を入力したら会員登録ができるなどです

##異常系
「ユーザーが開発者の意図しない操作を行った時の挙動」を確認するテストコードが、異常系に分類されます。
たとえば、必須項目を入力せずに送信した時にエラー文を表示するなどです。

テストコードの種類は、大きく2つあります。部分的に意図通りに動作するか確認する単体テストと一連の動作が問題なく行われるか流れも確認する結合テストです。

##単体テストコード
モデルやコントローラーなどの機能ごとに問題が

元記事を表示

OTHERカテゴリの最新記事