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

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

RubyもRailsもSQLも知らんC++erですがいきなり戦いを挑んでみた

## はじめに

これまでC++、JavaScirpt、C#、Rustなどなどいろいろな言語を触ってきましたが、Rubyはほとんど触る機会がありませんでした。
またデータベースも`SELECT`文というのがあるくらいの知識しか持っていませんでした。

ところでいろいろありお仕事で以下の新しい要素~~しかない~~に満ち溢れている領域への挑戦をすることになりました。

– Ruby
– Rails
– Active Record
– ActionView
– etc
– Rspec
– Factory Girl
– MySQL

無事にRailsチョットワカルになれたと思うのでそこで得た知見をまとめてみようかと思います。

## 環境構築

環境構築のはまりポイントもあったのですが職場の手順書が改善されてしまったので(いいことだけど)、書くモチベがないので割愛します。

## haml入門

“`haml
– content_for :main_pane do
= render ‘new’, :setting => @foo_setting
= r

元記事を表示

【Docker 】app_1 | Could not find (gem.lock名) エラーの解決方法

# 概要

docker × railsでdokcker compose upした際に**「Could not find (gem.lock名)〜」**というエラーが発生した。
bundle install 時にgemのインストールが失敗しているとのこと。

別の人の環境では動いたので、記述は間違ってない。
dockerのvolumeを削除してみる。

# 環境
・MacOS Apple M1 バージョン11.4
・Docker 20.10.7
・Ruby 2.5.9
・Rails 5.2.6

# volumeとは
ボリュームとは、データを永続化できる場所のこと。
**「名前付きボリューム」**と**「匿名ボリューム」**があり、名前付きボリュームの場合は Docker ホスト内で名前解決できるため、アクセスしやすい。
匿名ボリュームは適当にハッシュ値が振られる。
他のプロセスからはさわれないので安全。基本はこれを使うのがよい。

## dockerのvolumeの中身を見る

“`
% docker volume ls
“`

“`
DRIVER VOLUME NAME

元記事を表示

予約可能と予約不可で色分けをする

[1.はじめに](#1-はじめに)
[2.予約画面のイメージ](#2-予約画面のイメージ)
[3.実装](#3-実装)
[4.コード](#4-コード)
[5.おわりに](#5-おわりに)

#1. はじめに
予約可能と予約不可で処理を分けたいと考えましたが、思った通りに行かなかったのと、検索しても記事が少なかったのでまとめます。
前提として、sheetの座席はマスターデータとしてDBに保存してあります。
予約テーブル(Reservations)と、座席テーブル(Sheet)が関連づけられています
予約テーブルは座席テーブルにidをsheet_idとして保持します。

|Reservations| Sheet |
|:———–|————:|
| sheet_id | id |
|    ・ | row |
|    ・ |column |

#2. 予約画面のイメージ
予約できる場合はオレンジ、予約不可の場合は色を暗くして視覚的にわかりやすくしています。
今回は映画館がモデ

元記事を表示

railsでAjaxが上手く連動してくれない時の対処法の1つ

#railsとAjaxが上手く連動してくれない時の確認
現在railsでアプリケーションを作成していて非同期通信を導入しようとしていました。
ですが、何が原因なのか上手く動作する時としない時があり原因不明だったのですが、なんとか解決に導いてもらえたので整理しておくために記録します。

“`ruby:jsファイル
function post (){
const submit = document.getElementById(“submit”);
submit.addEventListener(“click”, () => {
const form = document.getElementById(“form”);
const formData = new FormData(form);
const XHR = new XMLHttpRequest();
XHR.open(“POST”, “/posts”, true);
XHR.responseType = “json”;
XHR.send(formData);
});
}

元記事を表示

Railsで外部テーブルに条件をつけて数順で並び替える、外部テーブルにレコードがなくても表示する

## 前提
投稿の`Post`モデルと、投稿を評価する`Evaluation`モデルがあり、
`evaluations`テーブルには`posts`の外部キー`post_id`がある

`evaluation`には`status`というカラムがあり、enumで管理されており値は以下の通りである

“` models/evaluation.rb
enum status: {
bad: 0 ## 低評価
good: 1 ## 高評価
}
“`

また、`post`は会員と管理者どちらでも投稿することができる
管理者が投稿する場合には`post.admin_id`に自分のidを入れる

簡略化したschema情報は以下の通りである

“` schema.rb
create_table “posts”, options: “ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin”, force: :cascade do |t|
t.bigint “admin_id”
end

creat

元記事を表示

around_actionで引数ありのメソッドをlambdaで指定する

## 概要

`around_action`に引数を持つメソッドを指定する際に無限に詰まったので同じ状況で困っている人のために残しておく。(最終的に上司に助けていただいて解決した。)

指定方法だけ知りたい人は`解決`までジャンプしてもらえれば書いてある。

## 状況

なぜ詰まったかというと、まずrailsでAction Controllerのフィルターを使用する際に引数を持つメソッドを指定する場合、ブロックを渡す必要がある。下記のようにしないとエラーが出てしまう。

“`rb
class HogeController < ApplicationController # 引数なしの場合 before_action :fuga # 引数ありの場合 before_action -> { fuga(x, y) }
end
“`

`before_action`と`after_action`を使用する場合は上記の記述で問題ないけど、`around_action`を使用する場合は1つ問題が発生する。

Railsガイドを読むと下記のように記述がある。
>「around系」

元記事を表示

コントローラーの単体テストコードの概念!

#①.結論!

コントローラーのテストは、あるアクションにリクエストを送ったとき、想定通りのレスポンスが生成されるかどうかを確かめる!

という事です!

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

この時に、RSpecの中でもRequest Specと呼ばれる手法を利用します!

#②.Request Spec

RSpecが提供している、コントローラーのテストコードを書くために特化した手法です!

RSpecの導入が完了していれば使用できます!

ちなみに、コントローラーのテストコードは、結合テストコードに記述する内容と、同じような責務を果たすことが多いです!

#③.まとめ

簡単にいうと、Request Specはコントローラーのテストコードを書くことに特化している手法であること!

という事ですね!

記述などは、、また改めて細かく書いて説明するようにします!

何か説明で間違っていたらご指導お願い致します(_ _)

元記事を表示

rakeファイルをRSpecでテストする

##環境
Ruby 3.0.2
Rails 6.1.4.1

##設定

“`spec/rails_helper.rb

Dir[Rails.root.join(‘spec’, ‘support’, ‘**’, ‘*.rb’)].sort.each { |f| require f }

“`

“`spec/rake_helper.rb
require ‘rake’
require ‘rails_helper’

RSpec.configure do |config|
config.before(:suite) do
Rails.application.load_tasks
end

config.before(:each) do
Rake.application.tasks.each(&:reenable)
end
end
“`

spec下にファイルを作成し、いつものようにテストを書いていく。

“`spec/lib/tasks/XXXXX_spec.rb
require ‘rake_helper’

describe ‘XXX

元記事を表示

キーワード検索とタグ機能の両立

#前提
キーワード検索機能
GeekSalon教材7-1

タグ検索機能
https://qiita.com/MandoNarin/items/5a5610a40c66f77d6c10

以上を実装済み

#コード

“`posts_controller.rb
def index
@posts= Post.all
@tags = Tag.all
@posts = @posts.where(“body LIKE ? “,’%’ + params[:search] + ‘%’) if params[:search].present?
#もしタグ検索したら、post_idsにタグを持ったidをまとめてそのidで検索
if params[:tag_ids].present?
post_ids = []
params[:tag_ids].each do |key, value|
if value == “1”
Tag.find_by(name: key).posts.each do |p|
post_ids

元記事を表示

Rails render パーシャル locals collection asについてのメモ

# 概要
・パーシャルではインスタンス変数を使用してはいけないのはなぜか
・locals」「collection」でローカル変数にしてパーシャルに渡す方法
・「as」オプション の使い方

# パーシャルではインスタンス変数を使用してはいけないのはなぜか

### 結論
部分テンプレートの再利用性が低くなる為。
→依存度が高くなってしまうから

**だから、ローカル変数にして渡す!!**

#「locals」「collection」でローカル変数にしてパーシャルに渡す方法

##ローカル変数を渡さず、ただパーシャルをrenderするとき

“`
<%= render 'ディレクトリ名/パーシャル名(「 _ 」は省略する)' %>
“`

ex)

“`ruby:shared/_footer.html.erb

元記事を表示

Rspecまとめ

すぐ忘れるので、まとめてみた

## Rspecを導入する
“`ruby:Gemfile
group :development, :test do
gem “rspec-rails”
end
“`
“`ruby:ターミナル
rails g rspec:install
“`
“`ruby:.rspec
# 見やすくするため追加
–format documentation
“`
## FactoryBotを導入する
“`ruby:Gemfile
group :development, :test do
gem “factory_bot_rails”
end
“`

##Capybaraを導入する
“`ruby:Gemfile
gem ‘capybara’
“`

## Rspecを実行する
### rails_helperの設定
“`ruby:spec/rails_helper
require ‘capybara/rspec’

RSpec.configure do |config|
config.include Devise::Test::Inte

元記事を表示

Google mapを使って住所検索できるようにした

Google map apiを使って住所を検索して表示できるようにした
## Google map apiの利用
こちらの記事を参考にしました。
[Google Maps API を使ってみた](https://qiita.com/Haruka-Ogawa/items/997401a2edcd20e61037)
[“Maps JavaScript API”を利用してGoogle Mapをページに埋め込む方法](https://web-saku.net/googlemap-mapsjavascriptapi/#apiloads-limitation)

– googleアカウントを作成
– Google Cloud Pratformにアクセスし、プロジェクトを作成
– Map JavaScript APIを有効化し、APIキーを取得

### 試してみる
“`html:html



Sample_GoogleMap