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

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

薄いコントローラ、分厚いコントローラとは何か

MVCモデルを用いて開発をしている際、「薄いコントローラ」や「分厚いコントローラ」という言葉をよく聞くかと思います。
薄いコントローラとはなんでしょうか?分厚いとどうなるのでしょうか?
コントローラの整理をキッチンの棚の整理に例えて説明していきます。

# コントローラってどうやって書いたらいいんだっけ?
Railsの生みの親であるDHHは下記のように言っています。

>コントローラが元々持っているRESTアクションやデフォルトの5つの機能にはないメソッドを付け加えたいと思ったら、いつだって新しいコントローラを作る。それだけでいいのです。

https://postd.cc/how-dhh-organizes-his-rails-controllers/

5つの機能って何?という方は、ぜひ調べてみてくださいね。
7つのアクションと言われていることの方が多いかもしれません。

https://qiita.com/morikuma709/items/5b21e9853c9d6ea70295

7つのアクションを用いたコントローラの作成方法について少しだけ解説すると、、、
ある機能を実

元記事を表示

seed_fuでYour seed constraints contained unknown columns: `id`.と言われたのはそのテーブルのプライマリキーがidではなかったから

Fusicの賀来という者です。

https://fusic.co.jp/

## 解決したい問題

ある日、Railsアプリでseed_fuというgemでseedを流したところ、怒られました。

“`terminal
rails aborted!
ArgumentError: Your seed constraints contained unknown columns: `id`. Valid columns are: `user_id`, `group_id`, `group_uid`, `created_at`, `updated_at`.
“`

gemはこちら。

https://github.com/mbleigh/seed-fu

バージョンの確認です。
古くてちょいアレですが…。

“`
ruby:2.3.4
Rails 5.1.7
“`

seedファイルはこうなっています。

“`ruby
UserRegistration.seed do |ur|
ur.user_id = user.id
ur.group_id = group.id
end

元記事を表示

RubyでPythonみたいな文字列スライスがしたい

Pythonでは文字列`s`に対し`s[a:b:n]`とすると`s`の`a`番目から`b`番目の1個手前まで`n`個飛ばしで文字が取り出される。

一方Rubyの文字列クラスにも[`slice`]()メソッドがあり、
“`rb
‘abcdefg’.slice(1…5)
“`
または
“`rb
‘abcdefg'[1…5]
“`
はPythonの
“`py
‘abcdefg'[1:5]
“`
と同様であるが”n個飛ばし”はできない。

## 考えた強引なやり方
– まず`a`番目から`b`番目の1個手前までの部分文字列を取り出す
– 部分文字列から`インデックス%n==0`となる文字を取り出して繋げる(mapとjoinを使う)

例えばPythonでの`’abcdefg'[1:5:3]`はRubyでは以下のように書ける。
“`rb
‘abcdefg'[1…5].each_char.with_index.map { |c, idx| c if idx%3==0 }.join
“`
`idx%3==0`は`(idx%3).zero?`でも可。また、2つ飛ばしなら`

元記事を表示

【Ruby】で配列に複数入ったオブジェクトを一つだけ消そうとしたら失敗した

こんにちは
Rubyでアプリを作っていたんですが
終盤になってデバッグに悩まされたことをまとめておきました。
もしも同じエラーで悩んでいる方がいて、参考になれば幸いです。

## 事の発端

「あれ、さっきまでエラーじゃなかったのに」

知り合いとバグを探していたところ、エラーが解決したのにエラーが同じところで再発したのが事の発端でした。

目的は **配列の中から指定した条件で一つのオブジェクトを削除する** でした。

### 配列.select!で行うとclassが異なる

目的はシンプルなものなので、オブジェクトが複数格納された配列の中から条件に見合ったものを抜き出して、
プログラムが実行されると**一つだけ**削除する。
なので、配列の入ったものに対して破壊的メソッドを定義しようとこのときは`select!`を使用しました.

“`ruby: test_program.rb
@ary = [1,2,3,4,5]
@ary.select!{|n| n == 2}.shift
“`
シンプルに書き直すとこんな感じでしたが、エラーで撃沈します。
そもそもshiftはArry

元記事を表示

【Rails】画像アイコンを作ってみよう!【画像表示、加工】

## はじめに
どうも、春からエンジニア転職予定のkazuhiroです。
文系職からの転職であり、プログラミングは未経験ですが、
初学者目線で疑問に思った点などを、アウトプットしていきたいと思います。
※間違いや改善点などありましたらコメントいただければ幸いです。

## 本題
転職先のBossより、このような練習問題が出された。![スクリーンショット 2023-01-04 1.18.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/585419cf-e369-c754-7f01-065d661ba97a.png)

やってやんよ、と。
ユーザー一覧画面については、以前掲示板一覧画面を作成していたため、
同様の手順で作成することができたが、画像の表示方法で引っかかってしまう。
![掲示板.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/c8c22586-d21a-7a7a-8830-8d0

元記事を表示

Rails devise パスワードリセット後のリダイレクト先の指定

# 何がしたい?
ログイン画面の「パスワードを忘れた方」よりパスワードをリセットした場合に特定のページへリダイレクトしたい。
(deviseのデフォルトの場合はログイン画面へ遷移します。)

# 何が難しかったのか
なんといってもdeviseは簡単にログイン回りの機能を全て実装できる代わりに何が起きているのかわからないブラックボックス状態じゃないですか?
少なくとも僕は完全に理解したとは言い難いです。
今回パスワードリセットのメールを送った後に遷移するページを指定したいだけなのに異常に難しかったので記事にしておきました。

# 結論
いいから教えろ!

## 1. routesに追加
“`ruby
devise_for :users, controllers: {
passwords: ‘users/passwords’,
}
“`

## 2. Users::PasswordsControllerを作成
Devise::PasswordsControllerの継承を忘れずに。

“`ruby
module Users
class PasswordsController

元記事を表示

【Ruby】Array.newを迂闊に使ってはいけないワケ…

(これに2時間気づかず時間を浪費した腹いせに、記事を書いています。)

# 配列内のオブジェクトを1つだけ変更したつもりが全部変わっている罠

“`ruby
nested_array = Array.new(2, [])
pp nested_array
# [[], []]
“`

なんてことはない、二重配列ですね。この1つ目の子ども配列に適当な値をpushしてみます。

“`ruby
nested_array = Array.new(2, [])
pp nested_array
nested_array[0].push(‘テキスト’)
pp nested_array
# [[], []]
# [[“テキスト”], [“テキスト”]]
“`

ちゃんと1つ目の子ども配列を指定したにも関わらず、両方の子ども配列に要素が追加されてしまいました。

### Array.newで複数作るオブジェクトは同じオブジェクトとして扱われる

“`ruby
nested_array = Array.new(2, [])
pp nested_array[0].object_id
pp nest

元記事を表示

RubyOnRailsでGoogleTextToSpeechを使う。

GoogleTextToSpeechに関する記事は、いくつかあるが、Rubyに絞ると良い記事がなく、比較的ハマったので、備忘録として、記録しておく。

## 結果として、こうなります。

“` Gemfile *.rb
gem ‘google-cloud-text_to_speech’, require: false
“`

“`*.rb
require “google/cloud/text_to_speech”

def self.generate_speech
# client生成
client = Google::Cloud::TextToSpeech.text_to_speech do |config|
# サービスクライアントを作成し、ダウンロードした秘密鍵を指定する。
config.credentials = “config/xxxxxxxx.json”
end
  # 設定値はこちら
speech = {
audio_config: {
audio_encoding: “M

元記事を表示

xcodebuild で躓いた時の解決方法(備忘録)

## 環境
Mac
Ventura

## やったこと
Xcode コマンドラインツールの version を確認しようとするが、以下の error が表示される。
“`
$ xcodebuild -version
xcode-select: error: tool ‘xcodebuild’ requires Xcode, but active developer directory ‘/Library/Developer/CommandLineTools’ is a command line tools instance
“`

Path がおかしいのかも?と思い、Path を確認。

“`
$ xcode-select -p
/Library/Developer/CommandLineTools
““

以下に変更する。
“`
$ sudo xcode-select -s /Applications/Xcode.app
“`

再度 version を確認

“`
$ xcodebuild -version
Xcode 14.2
Build version 14C

元記事を表示

Ruby 日付と曜日を出力する

今日の日付と曜日を出力するコードを作りましょう

“`ruby:出力例
現在は西暦2020年5月27日(今日の日付が入ります)
水曜日です(今日の曜日が入ります)
“`
ヒント
Time.newメソッドを使用しましょう

### Timeクラスとは
TimeクラスはRubyの標準ライブラリにある。時刻を表すクラス。

“`ruby:使用例
# 現在時刻
now = Time.new
puts now
“`

“`ruby:自分の解答
now = Time.new
week = [“日曜日”, “月曜日”, “火曜日”, “水曜日”, “木曜日”, “金曜日”, “土曜日”]
week[now.day]

puts “現在は西暦#{now.year}年#{now.month}月#{now.day}日”
puts “#{week[now.wday]}です”
“`
“`:ターミナル
現在は西暦2023年1月10日
火曜日です
“`

“`ruby:模範解答
now = Time.new
puts “現在は西暦#{now.year}年#{now.month}月#{n

元記事を表示

(備忘録)Java概要

# Java
* 私の住んでる地域では、Javaによる開発需要(求人)がとても高く、それに合わせてJava学習の必要性を感じた。
* Javaは、求人数でもJavaScriptと並ぶほど多く、今後開発者として学んでおく必要性が高い言語だと思う。(PAIZA基準)
* そのJavaの特徴を、Rubyと比較しながら、覚えていきたい。

# Ruby on Railsの特徴

* 短期間でプロダクトのリリースが可能
* 言語学習のコストが低い
* スタートアップでよく使われる(リリースが早い為)
※Ruby on Railsの開発者であるDHHは、Ruby on Railsに関して、”Javaの典型的なフレームワークより10倍以上の生産性がある”とアピールしてた。

# Javaの特徴

* アプリケーションの仕様変更を行いやすい
* セキュリティが強固である
* 長期間にわたる保守・運用がしやすい
* 実行速度が速い
* 大手企業の基幹システムなど大規模開発に適した言語

# Rubyと比べてJavaが難しいと言われる理由

## ①覚えるルールやコードの記述量が多い
* Railsは、ア

元記事を表示

【Docker】docker-compose upした時にA server is already running. Check /product-register/tmp/pids/server.pid. エラー

## 1. 問題

“`docker-compose up“`し時に“`A server is already running. Check /product-register/tmp/pids/server.pid.
Exiting“` エラーが出て、立ち上がらなかった。

“`:console
/usr/local/lib/ruby/2.7.0/net/protocol.rb:66: warning: already initialized constant Net::ProtocRetryError
/usr/local/bundle/gems/net-protocol-0.2.1/lib/net/protocol.rb:68: warning: previous definition of ProtocRetryError was here
/usr/local/lib/ruby/2.7.0/net/protocol.rb:206: warning: already initialized constant Net::BufferedIO::BUFSIZE
/usr/

元記事を表示

Ruby on Rails初心者の学習記録 Part1

# はじめに
Ruby on Rails初心者の学習記録です。
Railsを利用して、簡単なWebアプリケーションを開発できるようになることをゴールにしています。
※随時更新予定です。

# 1. Rubyの基礎を学習
Rubyも利用したことがなかったので、まずはRubyを簡単に勉強しました。
[Progate](https://prog-8.com/)というオンラインプログラミング学習サービスを利用しました。初心者がつまりやすい開発環境の構築が不要なので、手っ取り早くRubyの文法を学ぶうえでは、利用しやすかったです。

# 2. Railsインストール
1.である程度Rubyの雰囲気はつかめたので、次はRailsのインストール及び関連作業を行い、Railsを利用したWebアプリケーション開発の準備をします。
※利用OSはWindows11です。

## Rubyインストール
Railsをインストールする前にRubyをする必要があります。[「Rubyのインストールと環境設定」](https://www.javadrive.jp/ruby/install/)を参考にインストールしました

元記事を表示

hidden_fieldの使い方

<%= form_with model: @umarepos, local: true do |f| %>
<%= f.hidden_field :cook_id,{value:1} %>

hidden_fieldの使い方は、第一引数に保存したいカラム名、
第二引数に。保存(カラム)したい値を記述する。
今回の場合、cook_idのカラム名に、value1を付与することになる。

元記事を表示

カテゴリーごとの一覧表示

所有するコスメの使用期限を管理するアプリを作成中です。
初めてのオリジナルアプリということでわからないことだらけの実装のため、備忘録として記録していこうと思います。

# はじめに
大分類のカテゴリー(4種類)、小分類のカテゴリー(24種類)とで大きく2つに分けていますが、
カテゴリーを扱うにあたって`Active_Hash`[^1]を使用しました。

# 課題
登録したコスメを大分類カテゴリーごと且つ新しい順に表示させるのに
特定のカテゴリーで登録されたデータのみ取得するにはどうしたらいいんだっけ?

# カテゴリーの取得
調べたところ、`whereメソッド`[^2]に辿り着きました。(すっかり忘れてました・・・)
“`ruby
class ItemsController < ApplicationController def index category_face = Item.where(category_id: 2) category_eye = Item.where(category_id: 3) category_lip = Item.wh

元記事を表示

Rails7+Bootstrap環境の構築について

## ■Bootstrap5を使ってみたいと思ったきっかけ

Railsチュートリアルで使っていたBootstrapをポートフォリオのフロントでも使いたい…でもチュートリアルだとBootstrap3だからいかにも…感が否めない。どうやらBootstrap5だと割とモダンなnavbarなどのコンポーネントが提供されていそう、、、と感じたため。先に断っておきますが初学者のため間違っている箇所がありましたら、ご指摘いただけますと幸いです。

## ■導入方法

Rails newコマンドのオプションを指定するだけです。

“`jsx
rails new [アプリ名] -j esbuild –css bootstrap
“`

## ■確認

Bootstrap5のサンプルコード(下記画像ではNavbar)をとりあえずRailsのビューに記載してみて確認する。

![スクリーンショット 2023-01-08 21.06.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092884/07c4b01

元記事を表示

【議事録】Webレスポンシブデザイン実装後、デザインが崩れる問題(要素の重なりがおかしくなる)(z-indexで解決)

# 初投稿
本記事が初めての投稿になります❗️

# はじめに
– 本記事は、議事録としてまとめたものになります。
– 他の方の参考になる可能性も踏まえて、一般公開も行なっております。
– また記載内容はすべて、正しい内容が記載されているとは限りません。
– 誤った内容を見つけた場合は、ご指摘をお願いいたします。

# 背景
– 自分のアプリ(ポートフォリオ)へ、Webレスポンシブデザインを適応しようとした時の話。
– 現在、ユーザーはPCブラウザからの利用ではなく、スマホからの利用頻度が高いだろうと考え、実装することにした。
– 実際に自分のアプリに、Webレスポンシブデザインを実装したところ、以下のように要素が重なって表示されてしまう事象が発生した。

# 環境
OS:MAC
ブラウザ:GoogleChrome
開発言語:Ruby on Rails

### サイドバーを表示していない場合
– 特段、画面上は問題なし。
![スクリーンショット 2022-12-28 20.24.53.png](https://qiita-image-store.s3.ap-northeast-1.a

元記事を表示

[初学者向け] Ruby 論理演算子を理解する

## 本記事について

本記事は、Rubyを学び始めた私自身が「?」となった**論理演算子**について、
学んだ内容をまとめます。
私と同じく「?」となった初学者の皆さんがこの記事を読むことで
理解できるようになることを目的とします。経験の浅い私ならではのシンプルな文章が、
皆さんの理解の一助になることを願います。

### 論理演算子とは?

そもそも論理演算子とは? Google先生に聞いてみると、下記とのこと。
>「論理演算子とは、「真」と「偽」の2つの値だけで行う計算(論理演算)を表す
記号のことです。」

いまいちピントこない。というのが私の第一印象です。

私が腹落ちした、もう少し噛み砕いた表現にすると、

**「論理演算子とは、複数の条件式を組み合わせた条件式の真偽を教えてくれる記号」**

例えば、下記の2つの条件式があったとします。

条件式1 a > b
条件式2 a > 10

ここで論理演算子を用いれば、

– 条件式1を満たす、かつ条件式2も満たす場合
– 条件式1と条件式2のいずれかを満たす場合

のように、複数の条件式を組み合わせた条件の真偽を結果と

元記事を表示

Rails 制作中アプリのアプリ名を変更する

# 1.はじめに
2作目のポートフォリオを制作中にアプリ名を変更したくなったため、やり方を調べて対応しました!
その記録を残しておきます。

# 2.前提条件
#### 開発環境
Ruby:ruby 3.1.2
Rails:Rails 6.1.6.1
OS:Windows11 Home
統合開発環境:Cloud9
ソースコード管理:GitHub

#### やりたいこと
railsアプリケーション名の変更

# 3.手順
#### ①バックアップ
万が一の事態に備えて、アプリ名を変更する前にバックアップを取っておく。
1)GitHubから対象のアプリを開く。
2)「<>Code▼」を押して、LocalからsshのURLをコピーする。
3)ローカル環境にcloneして、仮置きディレクトリに格納する。
※仮置きディレクトリ名は、後ろに2を付ける等なんでもOK!
“`
git clone 対象アプリのURL
“`

#### ②Railsアプリ名称変更
Railsのファイル名変更はGemfileを入れることで簡単に行える!

1)アプリ名を変更したいアプリのGemfileに下記

元記事を表示

正規表現のキャプチャでグループ化した同じ文字の繰り返しにマッチさせる (Ruby)

今日の今日まで知らなかった正規表現
キャプチャした文字は置換だけではなく、同じマッチの中でも利用できる

# ポイント

– カッコ `()` で文字をキャプチャする
– バックスラッシュと数字 ( `\1` とか `\2` とか ) でマッチした文字を再利用できる

# 例

たとえば次の例では abc いずれか2文字の繰り返しにマッチする

aa はマッチする

“`rb
“aa”.match(/([abc])\1/)
# #
“`

ab は同じ文字の繰り返しではないのでマッチしない

“`rb
“ab”.match(/([abc])\1/)
# nil
“`

文字種を問わずマッチさせるならキャプチャを使わずにこうだ
これは ab にもマッチする

“`rb
“ab”.match(/([abc]{2})/)
# #
“`

# 応用例 – キャプチャ文字を離れた位置で利用する

キャプチャは直前文字に対してだけ使えるわけではない
いちどキャプチャしたら後は自由な位置で使える

元記事を表示

OTHERカテゴリの最新記事