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

Ruby関連のことを調べてみた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

元記事を表示

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

元記事を表示

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

元記事を表示

[py2rb] 抽象基底クラス

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# 抽象基底クラス (Python)
“`python
from collections.abc import Sized

print(isinstance([1, 2], Sized))
print(issubclass(list, Sized))
print(isinstance([], Sized))
print(isinstance(set({1, 2}), Sized))
print(isinstance(3, Sized))
print(isinstance(‘Hello, world!’, Sized))
print(isinstance({‘id’: 1, ‘name’: ‘John’}, Sized))

# output
True
True
True
True
False
True
True
“`
https://qiita.com/shinsa82/items/4f0b9aa48efc58837548

こちらの記事が分かりやすい。
# defined?

元記事を表示

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

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 で競技プログラミング (AtCoder) をやっているときあるある

# はじめに
筆者はまだ競技プログラミング歴が浅い初心者である。Ruby が好きで、ふだん仕事でもプライベートでも Ruby を書く機会が多いため、Ruby で競技プログラミングをやっているのだが、競技プログラミングで書くコードはアプリケーションで書くコードとはかなり毛色が異なるため、アプリケーションの実装のノリで計算量が現実的ではないコードを書いてしまったり、Ruby っぽくない書き方をしてしまうことがある。

今回はそんな「Ruby で競技プログラミングをやっているときあるある」について紹介しようと思う。あまり役に立つような記事ではないため、娯楽程度に見てほしい。

# 用語
* TLE
* Time Limit Exceeded (実行時間制限超過) の略
* 提出したコードが規定の処理時間をオーバーした際に表示される
* この場合、正解とはならず得点は得られない

# Ruby っぽくないループの書き方をしてしまう
Ruby で配列のループを回すときは [`Array#each`](https://docs.ruby-lang.org

元記事を表示

ハッシュに関する解説

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でGoogleSpreadSheetのハイパーリンクの値を取る

セルの値は割と簡単にとれるし、公式でもコードが例示されているのでやりやすい。
ただ、セルの情報を取ろう(例えばハイパーリンク)とするとそのままだとダメだった。

### よくある例(というか公式)
https://developers.google.com/sheets/api/quickstart/ruby

だいたい`service.get_spreadsheet_values spreadsheet_id, range`で値を取る例が多い。
これだと拡張属性取れない。

### pythonだと…
https://stackoverflow.com/questions/46879715/get-hyperlink-from-a-cell-in-google-sheet-api-v4
こんなのが見つかったので、rubyでどう書くか調べる。

### rubydoc
https://googleapis.dev/ruby/google-api-client/latest/Google/Apis/SheetsV4/SheetsService.html#get_spreadsheet-i

元記事を表示

gem を作って公開してみた 〜開発編〜

# 0. はじめに

こちらは前回の [gem を作って公開してみた 〜準備編〜](https://qiita.com/Satoooon/items/a04cc778b0e5ac11ae24) の続きの記事になります。
今回はgem の開発について解説していきたいと思います。

今回も以下のgemをベースにお話しします。

https://rubygems.org/gems/ruby_calendar

# 1. ディレクトリ構成

前回まででビルド実行までが完了した状態です。こちらが完了すると以下のようなディレクトリ構成になっていると思います。(ビルド時の受け答えによって多少の違いはあります)

“`shell
ruby_calendar
├── CHANGELOG.md # 開発gemのチェンジログを記載するもの
├── CODE_OF_CONDUCT.md # ビルド時 Code of Conductの有無でyesで回答すると作成
├── Gemfile # 開発するうえで追加で必要なgemがあればこちらに追記する
├── Gemfile.lock
├── LICENSE.tx

元記事を表示

shift(Ruby)は配列の最初の要素を取り除き、その値を返す

Ruby 3.1 Arrayクラスshift

– shiftは配列の最初の要素を取り除き、その値を返します

“`ruby
a = [0,1,2,3,4]
print a.shift
#=> 0
print a
#=> [1,2,3,4]
“`

元記事を表示

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

元記事を表示

【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
“`
#モデルの作成

元記事を表示

CircleCI x CapistranoでAWSに自動デプロイ(IP制限あり)

CapistranoでAWSデプロイできていたけど、やはりpushのたびに自動でできたほうが効率が上がって良いと考え導入しました

# 前提
– Railsアプリ作成済み
– CircleCIで自動テスト導入済み
– CapistranoでAWSに自動デプロイ導入済み
– 任意のIPアドレスからSSH接続許可し、CircleCIから自動デプロイ
→[こちらの記事](https://qiita.com/TO-TO/items/b074ebf82f150abd6c77)が非常に参考になりました

しかしこの方法だと任意のIPアドレスからSSH接続できてしまいセキュリティ的によろしくない!ということで対策をします
今回は「CircleCI使用時だけセキュリティグループにルールを作成し、終了するとルール削除する」という方法で進めます

# 手順
1. ポリシー作成
2. IAMユーザー作成・ポリシーと関連付け
3. config.ymlの編集・シェルスクリプトを作成
4. 権限付与
5. pushで自動デプロイ完了
という流れで進めていきます

##1. ポリシー作成
1. AWS Conso

元記事を表示

OTHERカテゴリの最新記事