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

Ruby関連のことを調べてみた2022年05月14日
目次

accepts_nested_attributes_for を使ったフォームで意図しないユニークバリデーションの発生を回避する方法

## 解決したい問題
Railsでは `accepts_nested_attributes_for` を使って、`has_many`関連する子レコードを1つのフォームで更新することができます。
イメージとしてはこんな感じです。

![sample.002.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7465/fbd1d0e0-3c36-dcaf-715c-a787fbce39b4.jpeg)

上の画面では以下のようなBookモデルと、それに関連するAuthorモデルを更新するフォームです。
(本と著者はmany-to-many関連だろう、というツッコミが来そうですが、説明のために単純化してるので気にしないでください)

“`ruby
class Book < ApplicationRecord has_many :authors, dependent: :destroy accepts_nested_attributes_for :authors, reject_if: :all_bl

元記事を表示

開発勉強(controller)

今回も頑張っていきましょう。

今日は、前回なんとかサーバーの立ち上げまでできたので、実際に開発に向けて勉強していきます。

⭐️ MVC
  ・Railsは「MVC」というアーキテクチャーを使ったフレームワーク
  ・MVCというのは、「Model」「View」「Controller」の略
  ・この3つの中で最も重要なのは「Controller」
  
⭐️ コントローラーを作成する
  ターミナル上で前回作成したRailsAppへ移動し、以下コマンドを実行する
“`ruby:qiita.rb
rails g controller 名前
“`
  ※名前は半角英字とすること
“`ruby:qiita.rb
create app/controllers/hello_controller.rb
invoke erb
create app/views/hello
invoke test_unit
create test/controllers/hello_controller_test.rb

元記事を表示

Ruby | Qiita API で1人のユーザーの全記事一覧を取得する

100記事x100ページまで取得できるので、上限は1万記事。

# Ruby

“`rb
require ‘net/https’
require ‘uri’

(1..100).each do |i|
uri = URI.parse(“https://qiita.com/api/v2/users/#{ENV[‘USER_ID’]}/items?page=#{i}&per_page=100”)
res = Net::HTTP.get_response(uri)

puts res.response.body
end
“`

# コマンド実行例

“`
USER_ID=yumainaura ruby qiita-post.rb | jq
“`

# Qiita API のTOKENを使って実行上限数対策をする場合の例

“`rb
require ‘net/https’
require ‘uri’

(1..100).each do |i|
uri = URI.parse(“https://qiita.com/api/v2/users/#{ENV[‘USER_ID’

元記事を表示

【完全攻略】Ruby on Rails ***NO FILE*** が出てマイグレーションできない時の対処法

# はじめに
筆者は [大学生限定 プログラミングコミュニティ 『GeekSalon』](https://geek-salon.com/?utm_source=Direct&utm_medium=attract&utm_campaign=2Q&utm_content=Fukuoka_E_2Q)で活動している者です!

# エラー
さぁ実装したものを確認してみよう!とrails sをしたところこのような画面が、、、
![iOS の画像 (26).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/ea14ac0d-67e3-3602-1d8e-7fe9e623f6d2.jpeg)
しめしめ、これはマイグレーションができていないがゆえのエラーだなと思い以下を実行!
“`console:
$ rails db:migrate
“`
しかし、このコマンドがうまく実行できず、、、
マイグレーションファイルの状態を確認するために、以下を実行
“`console:
$ rails db:migr

元記事を表示

【超簡単】Ruby on Rails に BootStrapを導入する方法

# はじめに
筆者は [大学生限定 プログラミングコミュニティ 『GeekSalon』](https://geek-salon.com/?utm_source=Direct&utm_medium=attract&utm_campaign=2Q&utm_content=Fukuoka_E_2Q)で活動している者です!

# Bootstrapとは
世界で一番人気のあるフロントエンドライブラリです。
モバイルファーストなレスポンシブウェブを素早くデザイン・カスタマイズすることが可能です。
豊富なコンポーネント、強力なJavaScriptプラグインを備えています。
詳しくは、[Bootstrap公式サイト](https://getbootstrap.jp/) を!!
## Ruby on Rails への導入方法
①まずは[Bootstrap公式サイト](https://getbootstrap.jp/)へアクセス!
②サイト内のはじめるボタンをクリック!
![スクリーンショット 2022-05-13 23.36.54.png](https://qiita-image-store.s3

元記事を表示

Rubyでのメソッドの戻り値について勘違いしていた

Rubyのメソッドの戻り値は、`return`に渡した値です。
“`ruby:greeting.rb
class Greeting
def name(num)
if num == 1
result = ‘Tom’
elsif num == 2
result = ‘Ken’
else
result = ‘Yumi’
end
result
end
end

greet = Greeting.new
puts “Hello,#{greet.name(1)}!!!”
puts “Hello,#{greet.name(2)}!!!”
puts “Hello,#{greet.name(3)}!!!”
“`
“`ruby:実行結果
Hello,Tom!!!
Hello,Ken!!!
Hello,Yumi!!!
“`
上記の場合は`return`を省略していますが、
省略されているだけで`result`が`return`に渡っています。

そして`return`を呼び出さない場合は、メソッド内の最後の式の値を

元記事を表示

fastlane経由でiOSアプリをFirebaseAppDistributionからテスト配信する時は、Rubyについて知っておくほうが良かった話

# はじめに
こんにちは、iOSエンジニアの [dayossi](https://twitter.com/dayossi) です。

家族が幸せになれるサービスを提供したいと思って、
[HaloHalo](https://hallo-hallo.sakura.ne.jp/home/)という家族日記アプリをリリースしています。

今回は、Firebaseが提供しているアプリのテスト配布ツール`Firebase App Distribution`を
fastlaneから呼び出して、テスト配布を自動化する中で詰まった点を共有いたします。

fastlaneがRubyで構成されているにもかかわらず
私はRubyでの開発は全くやったことがないので、
ほぼ手探り状態でfastlaneを試しました。。

先人の方々の叡智を参考に
なんとかfastlaneを実行してipaファイルをビルドできる状態まで辿り着きましたが

肝心のFirebase App Distributionへデプロイできず、
かなり詰まりました。

同じような境遇で悩まれている方の参考になりましたら幸いです。

## 前提
以下の

元記事を表示

content_forメソッドでタイトルを動的に出力する

タイトルを動的に出力したいのでyieldメソッドとcontent_forメソッドをうまく利用する。
content_forメソッドを使うことでヘルパーメソッドが利用できるので、動的にタイトルを出力することができる。

まずは簡単にyieldメソッドとcontent_forメソッドの使い方を説明していく。

### content_for
content_forは表示したいコンテンツを設定するのが役割。
content_forの公式
“`erb
<%= content_for :コンテンツ名 do %>
コンテンツ
<% end %>
“`
具体例を用いて説明していく。
“`erb
<%= content_for :title do %>
トップページ
<% end %>
“`
コンテンツ名を:titleとした。そしてコンテンツはトップページとする。
content_forでは表示したいコンテンツをdo~endで囲む。
ここでいうコンテンツはページのタイトルとして表示したい文字列を設定。

### yield

yieldの公式

“`
yield(:コンテン

元記事を表示

【Rails7+スクレイピング+LINE】Qiitaの週間トレンド記事一覧に新しくランクインした記事達をLINEで通知したい

# はじめに
Qiitaの週間トレンド記事に入った記事は大体読んでいるのですが、新しくランクインした記事をどこかにピックアップできたら便利だと思ったので、LINEに通知するプログラムを作ってみました。

自分で方法を考えて作ったことがほぼなかったので若干迷走して作った結果、毎週日曜と木曜の朝に、新入り記事達のURLを素っ気なく容赦なく通知してくるプログラムが出来上がりました。

開発過程でいろいろサービスを使いましたが、2022/05/12現在、すべて無料枠でどうにかなっています。

(備忘録がわりに自分が何を考えていたかなどもつらつら書いているので、方法論だけ読みたい方はいい感じに飛ばし読みをお願いします。)

# やりたいこと
– Qiitaの週間トレンド記事一覧に新しくランクインした記事のURLを取得する
– 取得したURLを自分のLINEアカウントに通知する

# 環境
– Rails 7.0.2.3
– line-bot-api 1.23.0
– heroku

# 全体像
作ったものの全体像を軽く書きます。
## Qiitaの週間トレンド記事一覧のページから、スクレイピング

元記事を表示

RubyのC拡張で例外クラスを定義する方法

## はじめに

Ruby言語では、StandardErrorを継承して例外を定義する。

“`ruby
class NoIndexError < StandardError; end ``` RubyのC拡張ライブラリ(Ruby C extension)で例外クラスを定義したい。 ## やり方 ### 例外クラスを定義する C拡張を書く時もRuby言語とまったく同じように、StandardErrorを継承したクラスを定義すればよい。 以下のようにして例外を定義できた。 ```c VALUE rb_Bio; VALUE rb_CGRanges; VALUE rb_eNoIndexError; void Init_cgranges(void) { rb_Bio = rb_define_module("Bio"); rb_CGRanges = rb_define_class_under(rb_Bio, "CGRanges", rb_cObject); rb_eIndexedError = rb_define_class_under(rb_CGRanges, "In

元記事を表示

【rails】ゲストユーザー機能の実装

ポートフォリオ作成したけど、なんか忘れてる・・
そうだ、ゲストユーザー機能!
ということで備忘録として簡単に実装方法を記載します。

# 前提
・ユーザー登録機能(devise)が実装されている

# ルーティングの設定
`guest_sign_in`アクションはこのあとコントローラーで定義します。
“`config/routes.rb
post ‘homes/guest_sign_in’, to: ‘homes#new_guest’
“`

# アクションの定義
以下にて`guest_sign_in`を定義します。

1.`find_or_create_by`でゲストユーザーがあれば取り出す、無ければ作成する にする
2. パスワードはセキュリティの関係で`SecureRandom.urlsafe_base64`のランダムで作成できるよう設定
3. railsが用意してる`sign_in`メソッドを利用して、先ほど定義した`user`をログインさせる

“`controllers/homes_controller.rb
class HomesController < Appli

元記事を表示

action textで画像が表示されない

## 現象
action textを利用したリッチテキストをレンダリングした際に画像が下のようにはてなのアイコンが表示されてしまう。

![スクリーンショット 2022-05-12 23.03.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960407/83bbd65b-60a1-16da-409c-1d8c9bbfb472.png)

## 発生エラー
“`
LoadError (Could not open library ‘vips.42’: dlopen(vips.42, 0x0005): tried: ‘vips.42’ (no such file), ‘/usr/local/lib/vips.42’ (no such file), ‘/usr/lib/vips.42’ (no such file), ‘/Users/higuchiyuujirou/workspace/imagine/vips.42’ (no such file), ‘/usr/local/lib/vips.42’

元記事を表示

Notification API 通知サブスクリプション登録方法

# 目標
SPAPI Notification API (旧 MWS Subscription API)で通知サブスクリプション登録します。
今回は **ANY_OFFER_CHANGED** という通知タイプで登録行います。

各通知タイプの説明はこちらでご確認ください:
https://developer-docs.amazon.com/sp-api/docs/notifications-api-v1-use-case-guide#notificationtype

# 前提
・ AWSアカウントを作成されている
・ SPAPIに連携済で、リクエストコールできる状態のストアがあること

# 1. SQSメッセージキュー作成
Amazon通知の宛先を作成します。
使うのは[Amazon Simple Queue Service(SQS)](http://aws.amazon.com/sqs/)です。

タイプは標準に設定して、名前を入れてキューを作成します。
今回はデフォルト設定で、許可ポリシー、暗号化、デッドレターキュー、タグ全てなしです。
アクセスポリシー

Windows環境でゼロからRuby + Lambda + API GatewayでAPI作って公開するまでの記事

# 概要
この記事では、Windows環境でゼロからRubyの開発環境を作って、ローカルで作成したコードをLambdaにアップし、API Gatewayを通して公開するまでの手順を記載します。

# 対象
・細かいことは良いから、とりあえずRubyでAPI作ってWeb公開したい人
・Lambdaとやらを使ってとりあえず何か動くものを作りたいが、何から初めて良いか分からない人

# 環境
– windows10
– Ruby 2.7

# 目次
– 開発環境を作る
– Lambda関数を作る
– ローカルのコードをLambdaにデプロイする
– API GatewayでWeb公開する

# 開発環境を作る
まずはRubyの開発環境を作ります。

### Rubyのインストール
以下からRubyをインストールします。
■Ruby
https://rubyinstaller.org/downloads/

RubyはRuby+Devkitのver 2.7をDLして下さい
ver 2.7なのは、Lambda上で動くRubyが2.7なので環境を合わせるためです。
+Devkit版なのは、VSC

Decoratorをrailsに導入する

Decoratorの説明の前に例え話から。
Modelでは日時を”2018-07-12 18:12:34”という値で保持していますが、Viewでは”2018/7/12”と表示したい場合を考える。
前提としてモデルはデータの格納に関する情報だけを書くところ。ビューは情報を表示する役割だけを担うべき。じゃあ上の”2018-07-12 18:12:34”を”2018/7/12”に変える処理はビューとモデルのどちらに書くべきか?

正解はビューとモデルのどちらでもなくDecoraterに書くべき。

話が遅くなったがDecoraterとは名前の通りデコレーターで、情報を加工する処理を書き込む。
それはビューとモデルの間に置く。

### Decoraterを実装する

Decoraterを実装するにはDraperというgemを使う。
“`
gem ‘draper’
“`
で“`bundle install“`を実行。

###Decoraterを使って置き換えを行う。

##### 1、decoratorのメソッドを定義するファイルを作成する。
以下のコマンドである。
“`
rail

【Ruby】Rubyコードのパフォーマンスを計測したい

# 概要
Rubyのパフォーマンスを計測するためprofile.rbを使用して計測します。
実際に速度が遅くなっていないかを調べることがあったためメモとして残す。

# テストコード(フィボナッチ数列)

test_fib.rb
“`ruby
def fibonacci(i)
(i == 0 || i == 1) ? 1 : fibonacci(i – 1) + fibonacci(i – 2)
end
n = 20
puts “fib(%d) = %d” % [n, fibonacci(n)]
“`

そのまま実行すると
“`
$ ruby test_fib.rb
fib(20) = 10946
“`

profile.rbを使用して実行すると

“`
$ ruby -rprofile test_fib.rb
fib(20) = 10946
% cumulative self self total
time seconds seconds calls ms/call ms/call name
85

foo_comserver2をrubyから操作するメモ

foobar2000をfoo_comserver2(COM Automation Server)経由で操作するときに詰まったところのメモ

“`ruby
require ‘win32ole’
ole = WIN32OLE.new(“Foobar2000.Application.0.7”)

# index番目のプレイリストに移動。右辺はオブジェクト
ole.Playlists.ActivePlaylist = ole.Playlists[index]

# 名前で指定する場合
ole.Playlists.ActivePlaylist = ole.Playlists.each.find { _1.name == ‘playlistname’ }

# 現在のプレイリストのindex番目の曲を再生
# メソッド名からすると、foobarの設定によっては再生以外のアクションになるのかもしれない
ole.Playlists.ActivePlaylist.DoDefaultAction index
“`

コンソールからSidekiqの情報を見るときに created_at, enqueued_at などが日時じゃなくて謎の数字

問題

実例をあげます。
試しにデッド状態のジョブをひとつ見てみましょう。

“`ruby
# rails console

Sidekiq::DeadSet.new.to_a.first
=> #3,
“queue”=>”default”,
“class”=>”FooClass”,
“args”=>[“8ecd1021-62d7-4068-8d7b-bb11033163f6”],
“jid”=>”746d59154e31e75f09109f0b”,
“created_at”=>1649321038.4516313,
“enqueued_at”=>1649321184.3722708,
“error_message”=>”undefined method `-‘ for nil:NilClass”,
“error_class”=>”NoMethodError”,
“failed_at

Railsにサンプルデータを作成する方法

### 1,Fakerを導入する
“`
gem ‘faker’
“`
今回私はtest環境とdevelopment環境に反映したいので、
“`
group :development, :test do
# (略)
gem ‘faker’
end
“`
### 2、“`db/seed.rb“`にサンプルデータを作成する処理を書く。

“`rb
# 追加のユーザーをまとめて生成する
99.times do |n|
name = Faker::Name.name
email = “example-#{n+1}@railstutorial.org”
password = “password”
User.create!(name: name,
email: email,
password: password,
password_confirmation: password)
end
“`

### 3,“`rails db:seed“

[Ruby]moduleのメソッド定義についての学習記録

## まえがき
Web系エンジニア転職を目指して学習しております。
今回は「プロを目指す人のためのRuby入門」という書籍で学習している私の振り返り記録になります。
学習した内容全てではなく、一部分を取り上げて記録しております。
書籍の内容を記載しすぎるのは問題であると認識し、配慮しておりますが問題がある部分がありましたらご指摘頂けると幸いです。

## include?メソッド
呼び出したクラスオブジェクトに引数で渡したモジュールがincludeされているかをtrue or falseのBooleanで返す。include?メソット自体はStringクラスとArrayクラスにも同名のメソッドが定義されていますがあくまで今回のinclude?メソッドはClassクラスで定義しているinclude?メソッドと認識しています。この認識が正しいかは分からなかったので知っている方がいたらコメントで教えて頂きたいです。
“`ruby
module Profile
end

class User
include Profile
end

User.include?(Profile)
# tr