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

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

Rails のポリモーフィック関連でカラムの値とは異なるモデルを使用する

## 背景

あまりないかもしれませんが、例えばメインの Rails アプリで運用されてる DB にサブの Rails アプリからもアクセスしたいような場合に同じテーブルを違うネームスペースのクラスから扱いたい場合があります。

Rails のポリモーフィック関連はレコードの文字列をそのままクラス名として使うため、全く同じクラス名であれば問題ないですが別にネームスペースが切られていると面倒なことになります。

## 構成
具体的には以下のような場合です(最小限の部分のみ記載しています)。
あるメニューのリストのうちメニューそのもの、見出し部分、内容部分をそれぞれモデルにしています。

イメージ的には↓のような感じです。
![Screenshot_20220131-210817769.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189229/2c924db4-39bd-8d24-701c-ef30df519f2b.jpeg)

またバージョンは ruby 3.0.1、rails 6.1.4.1 です

元記事を表示

injectメソッド

rubyシルバーを勉強していくなかで、injectメソッドについてわかったなかったので、解説していこうとおもいます。

##injectメソッドとは
injectメソッドとは、たたみこみ演算を行うメソッドです。
詳細は、[公式ドキュメント](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/inject.html)を参照してください。
言葉で説明するのは、むずかしいのですが、具体例で見てみると分かるとおもいます。

“`
#合計を求める
1から6までをそれぞれ足していく。
p [1, 2, 3, 4, 5, 6].inject {|int, num| int + num }
=>21

#1から6までをそれぞれ掛けていく
p [1, 2, 3, 4, 5, 6].inject {|int, num| int * num }
=>720
“`

また、初期値を入れることもできます。先ほどのコードでいえば、

“`
p [2, 3, 4, 5].inject(0){|result, item| result + ite

元記事を表示

「Everyday Rails – RSpecによるRailsテスト入門」のセットアップで詰まったことと対処法まとめ

[「Everyday Rails – RSpecによるRailsテスト入門」](https://leanpub.com/everydayrailsrspec-jp)
職場の先輩におすすめしていただいたので、買ってみました。
そこのセットアップでつまずいたことと対処法を自分なりにまとめてみました。

# [「Everyday Rails – RSpecによるRailsテスト入門」](https://leanpub.com/everydayrailsrspec-jp)のセットアップの手順

“`
# ソースコードのダウンロード
git clone git@github.com:JunichiIto/everydayrails-rspec-jp-2022.git
# ディレクトリの移動
cd everydayrails-rspec-jp-2022
# 使用する Ruby バージョンを指定(本書では3.1.0を推奨。下記コマンドは rbenv を使用する場合)
rbenv local 3.1.0
# gem のインストール
bundle install
# データベースのセットアップ等
bi

元記事を表示

Elasticsearch::Modelのresultsとrecordsメソッドの違い

elasticsearchをなんとなく触っていたら、勘違いしてハマったので記事として残します。

## resultsとrecordsメソッドの違い
結論から書くとresultsメソッドはelasticsearchのドキュメントを返しますが、recordsメソッドはデータベースから取得したモデルインスタンスのコレクションを返します。

“`
response = Article.search ‘sample’

response.results.map { |r| r._source.title }
# => [“sample article 1”, “sample article 2”]

response.records.to_a
# Article Load (0.3ms) SELECT “articles”.* FROM “articles” WHERE “articles”.”id” IN (1, 2)
# => [#

, #
元記事を表示

let と let! の違い(遅延評価)

# はじめに
request specを書いているときに、エラーぶつかりました。その原因がletとlet!の違いによるものでした。
当時は違いを理解できていなかったため、エラーにかかって向き合う時間ができてよかったと思っています。
今回得た学びをまとめます。

# 開発環境
ruby ‘3.0.0’
Rails 6.0.3.4

# エラー原因

コントローラのテストをrequest specで実行する際、以下のようなソースで、indexアクションを検証していました。

“`ruby:request.rb
RSpec.describe “Gadjets”, type: :request do
let(:user) {FactoryBot.create(:user, :a)}
let(:category) {FactoryBot.create(:category)}
let(:gadjet) {FactoryBot.create(:gadjet, user_id: user.id, category_id: category.id)}

describe “Action

元記事を表示

【Capybara,webdrivers】統合テスト(System Spec)とは

##統合テスト(System Spec)とは
統合テストは、アプリケーション全体が一つのシステムとして期待通りに動くか否かを検証するテストのこと。

統合テストにおいては、“Capybara“という“ruby“のライブラリを使用。“Capybara“を使うことで、実際のアプリケーションの使われ方をコードで表すことができる。(**fill_in**や**click_button**など)

“webdrivers“は“ChromeDriver“を簡単に導入してくれるgemである。アプリケーション全体が一つのシステムとして期待通りに動くか否かを検証する場合、実際にブラウザでテストがそうのように動いているのか目視できた方が分かりやすいので、“Capybara“と“webdrivers“はセットで入れることが多い。

“Capybara“と“webdrivers“の導入を記載していく。

##gemの導入

“`Gemfile.
group :test, :development do
# (省略)
gem ‘capybara’
gem ‘we

元記事を表示

VMWare Fusionでguest(windows)からhost(mac)の開発環境(localhost:3000)にアクセス

### 環境

Host: Mac Big Sur 11.5.2
VM: VMWare Fusion 12.1.2
Guest: Windows 10 x64

### やりたいこと

お客さんの環境(Windows)だけで、デザインが崩れたので修正したい
Guest(Windows)からHost(Mac)の開発環境(localhost:3000)にアクセスして直接操作

### 手順

1 VMでWindowsを立ち上げる
2 Macのターミナルでコマンド実行

“`
$ ifconfig
“`

3 上記から該当するものを探す

“`
en0: flags=8863 mtu 1500
options=400
ether 3c:22:fb:13:df:4f
inet6 fe80::1c84:d089:5dae:5860%en0 prefixlen 64 secured scopeid 0x6
inet 192.168.128.56 netmask 0xff

元記事を表示

Rspecで特定のテストだけ実行する

##特定のテストを実行
特定のテストを実行には2つあり、1つは実行したいテストのファイル名と行数を指定する方法。

“`ターミナル.
$ rspec spec/models/user_spec.rb:8
“`
2つ目はテストコード“it“の前に“f“をつけるだけでそのテストのみ実行される方法。

“`task_spec.rb
require ‘rails_helper’

RSpec.describe Task, type: :model do
describe ‘validaton’ do
fit ‘タスクを問題なく作成’ do. #fitとなっているこのテストだけ実行される。
task = build(:task)
expect(task).to be_valid
expect(task.errors).to be_empty
end

it ‘タイトル空欄は無効’ do
task = build(:task,title: “”)
expect(task).to be_inva

元記事を表示

ヒアドキュメントについて

rubyシルバーを勉強していくなかで、hashについてちゃんとわかっていなかった今回は解説させていただこうとおもいます。

##ヒアドキュメントとは
複数行にわたる長い文章の文字列を扱い場合に便利な機能のことです。
言われてもピンとこないとおもいますので、実際にコードを見ていきましょう
ヒアドキュメントを使わないときと、使うときで比較してみていきましょう

“`
puts “ヒアドキュメントを使わない場合はこのようにクオーテーションで囲い、\n改行したい箇所に\\nを書くことで改行できる。\nちなみにバックスラッシュを二つ使うことで改行(\\n)をエスケープできる”
“`

上の書き方は、ヒアドキュメントを使わない書き方です。これでも、コード上は何も悪いわけではないのですが、なんか見た目悪くないですか?
可読性が落ちるんですね。
では次に、ヒアドキュメントを使う書き方を見ていきましょう。

“`
text = <

元記事を表示

RailsでJavaScriptファイルからのパスの通し方

## 実現したいこと
RailsのJavaScriptファイル内に記載した、画像・音楽ファイルへのパスを正常に読み込ませたい✅

## 開発環境
Ruby 3.0.2
Rails 6.1.4.4

## 結論
パスの指定を以下のように、“`asset_path“`を使用する。
※ JavaScriptの記載は、viewファイルのscriptタグ内に記載するか、“`hghg.js.erb“`のように、Rubyの埋め込みが可能な状態にする必要があります⚠️

“`ruby:任意のファイル
var ASSETS = {
sound: {
music: “<%= asset_path("energy.mp3") %>“,
ring: “<%= asset_path("tamborine.mp3") %>“,
},
json: {
beatmap: “<%= asset_path("notes.json") %>”
},
image: {
‘bg’:

元記事を表示

ハッシュに関する解説

rubyシルバーを勉強していくなかで、hashについてちゃんとわかっていなかった今回は解説させていただこうとおもいます。

##ハッシュって?
ハッシュとは、配列と似ていますが、**keyというものと、valueというものがある配列**です。
具体的に、コードを見ていきましょう!

“`
hash = {‘Satou’ => 19, ‘Hashimoto’ => 35, ‘Yamada’ => 23}
“`
こういうふうな書き方をします。
keyというものが、Satou, Hashimoto, Yamadaです。
valueというものが、19, 35, 23です。

このハッシュのメリットが、keyを目印にして、valueを取得することができるんです。

これと似たものに配列というものがあります。
配列は、0,1,2のような数字で値を取得するような書き方をするんですね。

ハッシュの方が直感的でいいですね。

##ハッシュの値の取り方
先ほどのコードを書いてみましょう

“`
hash = {‘Satou’ => 19, ‘Hashimoto’ => 35, ‘Yamada’ =

元記事を表示

【Rubocop】W: Lint/ShadowingOuterLocalVariable: Shadowing outer local variableについて

#状況
Rubocopを実行すると以下のエラーを吐かれた。

“`
spec/rails_helper.rb:65:23: W: Lint/ShadowingOuterLocalVariable: Shadowing outer local variable – config.
RSpec.configure do |config|
^^^^^^

108 files inspected, 1 offense detected

Exited with code exit status 1
“`

#対処法
spec/rails_helper.rbに書いたconfigというブロック変数の名称が、別ファイル(spec_helper.rb)で定義されたconfigというブロック変数に被っていたようなので、該当のブロック変数を適当に変更してみた。

<変更前>

“`ruby:rails_helper.rb
RSpec.configure do |config|
 config.include FactoryBot::Syntax::

元記事を表示

Ruby on Rails パーシャルとヘルパー

## 初めに
`ヘルパー`と`パーシャル`の使い方
違いを紹介
基本は備忘録

## ヘルパー

viewをよりシンプルにDRYに書くためのモジュール
`app/helpers/<コントローラ名>_helper.rb`
*moduleになっていてviewから呼び出せる*
*`link_to`や*`render`*等がヘルパーに該当し、独自に定義もできる
**`includeが必要な時`**
ControllerやModelで使う時はincludeが必要

“`rb
# 例
module ApplicationHelper

# ページごとの完全なタイトルを返します。
def full_title(page_title = ”)
base_title = “Ruby on Rails Tutorial Sample App”
if page_title.empty?
base_title
else
page_title + ” | ” + base_title
end
end

元記事を表示

Rails 新規登録フォームを作成する

## はじめに
基本は備忘録
Qiitaにすごく助けられている

## 新規登録フォーム
`今回はユーザー登録を参考に使うが、新規投稿でも似たような作り方`
*Userモデル・Controllerは生成済み*
*`bcrypt`*は設定済み
*users_ControllerやUser_Model*はログイン機構を参照
**bcryptを使う際の注意点**
新規登録時に`password`と`password_confirmation`を使用する

## 新規登録フォームの作り方
“`rb
# view側
# model: に newアクションで生成したインスタンス変数をset

<%= form_with(model: @user, local: true) do |f| %>

<%= f.label :name %>
<%= f.text_field :name, class: 'form-control' %>

<%= f.label :email %>
<%= f.email_field :email, class: 'fo

元記事を表示

Ruby on Rails form_withの使い方

## 初めに

`form_tag`しか使ったことがなく、`form_with`はじめてだったのでまとめてみた
基本は備忘録

## form_with
*railsで情報を送信するためのヘルパーメソッド*

## DBに保存するとき
“`rb
# インスタンスが空ならcreateアクションへ
# 情報が入っているならupdateアクションへ
<%= form_with model: モデルクラスのインスタンス do |form| %>

<% end %>
“`

“`rb
# Contoroller
def new
@user = User.new
end
“`

“`rb
# View
# newアクションで生成したインスタンスを指定する
<%= form_with model: @user do |form| %>

<% end %>
“`

## フォームの作り方
`name`属性の値をkeyに`params`で入力内容を送る
受け取り方は`params[:モデル名][:key]`
通常は`

元記事を表示

deviseによるユーザー登録失敗時に画面更新すると、Routing Errorが発生する

この記事は、ruby on railsとそのgemである‘devise’についての基礎知識がある前提で書かれていますのでご注意ください。

# どのようなエラーか
deviseには標準でユーザー登録機能が備え付けられています。
この新規登録を行う際、入力情報に不備がある(バリデーションに引っかかる)とエラーが出て、新規登録画面のビューが返されるようになっています。
単純に、DBに保存されたか否かで条件分岐をしているだけだと思うのですが、deviseの中身をじっくり見たわけではないのでそこは明確ではありません。

そこで問題となるのが、登録に失敗することでビューが返された状態だと、よく見るとURLが変化してしまいます(登録画面自体にはさほど変化はありません)。

登録ボタン押す前(エラー前)
![スクリーンショット 2022-01-30 18.18.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2283370/6d840965-4165-c180-4177

元記事を表示

[初心者log]Rails(API)で複数のデータを結合してjson形式で返す

#本記事の目的
Rails(API)+Reactで開発をしているとき、投稿にユーザーネームの添付に手こずったので、
今回はPost(投稿)コントローラのindexにおいてUser情報も加え、必要なものを返却する方法を調べたのでまとめておきます。

##UserテーブルとPostテーブル
![users_posts_table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2048885/a8178988-e4aa-cb1d-3712-5a3c5731bc10.png)

##必要な情報を結合して返却したい

“`app/controller/post_controller.rb
class PostsController < ApplicationController def index posts = User.joins(:posts).select('posts.id, title, body, name AS user') render json: { data: pos

元記事を表示

30代前半の地方公務員がプログラミングなどを学んでみた【はじめに】

# はじめに(自己紹介)

こんにちは!初めての投稿になります。
現在、年齢30代前半で地方公務員(技術系「化学」というちょっと珍しい職種です。)をしています。
仕事の内容は環境系(水質や大気などの公害関係)の部署で企画・調整的なことをメインにやっています。

【略歴】
大学〜大学院:工学部の化学・生物系の修士課程修了
1社目:産業ガスメーカー(2年弱)
2社目:技術系公務員(現在5年目)

大学・大学院時代は「バイオセンシング」という分野の研究室に所属していて、電気化学や分析化学、MEMS技術みたいなナノテクノロジーを活用して、細胞みたいなウェットな物を「測る」ことをメインに研究していました。

大学院終了後は内定をいただけたということと、医療や農業など成長分野に裾野を広げていて、キャリアの中で色々な分野を経験できる可能性があるなと考え、大手産業ガスメーカーに入社しました。というかなり違う分野(化学工学)のエンジアリングを担当し、ガス製造プラントのプロジェクトエンジニアリングから、実際の設計、試運転など幅広くやらせてもらいました。

もともと地元で学んだ技術を生かした仕事ができたらい

元記事を表示

【Rails】タグを追加して投稿する

#概要
備忘録としてユーザーがタグを追加して投稿する機能の実装方法をまとめました。

#参照
以下の記事を参考にしました。
ほとんど同じですが、上手く行かなかったところを自分なりに変更しました。
https://qiita.com/nakamura9atsuya20/items/6aca5c4f9d29307ec68a

#完成図
![tag_sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2287171/91bbd624-4d33-a64c-89b9-78c32e493d1a.gif)

#アプリの作成
“`ruby:ターミナル
$cd desktop
$rails new tag_sample
$cd tag_sample
“`
#DBの作成
DB(データベース)を作成していない人は作成しましょう!
作成済みの人は無視して次のモデルの作成に進みましょう!

“`ruby:ターミナル
$rails db:create
“`
#モデルの作成

元記事を表示

【Rails】Unable to autoload constant (module名)::(controller名)Controllerエラーが出た件

#状況

* routing、model、controller、viewを作成し、ローカルでページにアクセスしてみた。
* 以下のエラーが表示された。

“`
Unable to autoload constant (module名)::(controller名)Controller, expected
/(service名)/app/controllers/(controller名)_controller.rb to define it
“`
#解決法

コントローラーの内容を module ~ end で囲う。

“`ruby:(controller名)_controller.rb
module (module名)
class (controller名)Controller < ApplicationController (コントローラーの内容) end end ``` このような見落としを防ぎたい限りである。

元記事を表示

OTHERカテゴリの最新記事