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

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

本番環境だけNoMethodError undefined method

![スクリーンショット 2021-10-05 9.48.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653881/dfc014d0-de0f-1b61-bcc4-2663a71abf39.png)

このように本番環境だけ、undefined methodエラーがでた。

trades_countカラムをローカルで追加したので、

本番環境のターミナルで

“`
rails db:migrate RAILS_ENV=production
“`

を実行すれば本番環境でカラムが追加されるので、
エラーが解決できる。

元記事を表示

【Rails】Slim-railsのメモ

##概要
Ruby製のHTMLテンプレートエンジンであるslimを使えるようにするGem。Slimはコーディングを速くするだけでなく、コードを読み込むスピードも速くなる。

##手順

###インストール

Gemfile

“`
gem ‘slim-rails’
“`

bundle installh後、viewファイルの拡張子を「html.slim」に変更。

###実装例

html.erbの時

“`
<% @posts.each do |a| %>

<%= a.title %>

<% end %>
“`

slim-rails適用後

“`
– @posts.each do |a|
p = a.title
“`

###ポイント

– <% %> というruby記法の使用宣言が、「-」となっていること
– <%= %> というruby記法の使用宣言 + 出力が、「=」となっていること
– 閉じタグが不要なこと(段落によって閉じタグを判断する)
– `

~~

`という記法が、「p」となっていること(HTMLタグの<> や、閉じタ

元記事を表示

【Rails】Redisのメモ

##Redisとは
・KVSを保存する、NoSQLの一つ
・インメモリ方式
・セッションなど有効期限のあるデータを扱う場合
 や、ランキングデータなど重たいSQLを走らせた
 い場合に用いる

##実装手順
####Redisのインストール
“`
$ brew install redis
“`

####Redisサーバーの起動

“`
$ redis-server
“`

####Redisへの接続

“`
$ redis-cli
“`

###使用方法

SET を使って Key と Value を設定しデータを保存する。
GET で Key を指定して Value を取得する。
quit で redis-cli を終了。

“`
redis> SET mykey “A”
OK
redis> GET mykey
“A”
redis> quit
“`

###Railsへの導入

“`
gem ‘redis-rails’
“`
後にbundle install

config/enviroments/◯◯.rbの使用したい環境

“`
config.cache

元記事を表示

売り切れ商品をsold out表示にしよう!

#soldout表示にする大まかな流れ
一度購入された商品に対して、その後soldout表示させる方法をご紹介します。
下記のようにsoldout画像を表示できるようにします。

![8A3C76B5-1EF6-4317-820A-FF53EC6B8201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1547587/cbcc12e4-5379-ec72-ce21-cd425a3d0d68.png)

大まかな流れとしては、

①商品の状態判定に使用するカラムを設定する。
②購入確定ボタンを押して購入データを保存する際に、is_activeの値をtrueからfalseに更新する。
③viewページでif文の条件分岐により商品画像をsoldout表示にする。

##①商品の状態判定に使用するカラムを設定する。
商品テーブルに(カラム名:is_active, データ型:boolean, デフォルト:true, notnull制約)を設定する。
*この際の、デフォルトのtrueは販売中,falseは売り切れと

元記事を表示

[Ruby] 自作クラスを比較可能にする方法

## :ledger: はじめに:自作クラスで比較したいケース
自作クラスを簡単に比較したいケースがあると思います。
例えば、身長を格納するHeightクラスを作成したとします。
インスタンス化するときの式はこのようになります。

`taro_height = Height.new(180)`

そして、他の人と身長を比較したいケースが出てきたとします。

`hanako_height = Height.new(158)`

タロウさんとハナコさんの身長を簡単に比べるためには以下が出来ると嬉しいですよね。

`taro_height > hanako_height`

しかし、これを実現するにはモジュールのインポートと独自の実装が必要になります。
今回はテスト科目の点数を持つScoreクラスをサンプルコードとして扱っていき、比較可能にする方法を解説します。

## :ledger:自作クラスはそのままでは比較できない
まず、単純に自作クラスを作成して比較しようとしてみます。
サンプルコードをご覧ください。

“`rb
class Score
def initialize(ma

元記事を表示

if文による条件分岐(Ruby)

**基礎編**

まずは、基本的な書き方から紹介します。

“`
if <条件式>  then
 <文>
end
“`
<条件式>が真(falseとnil以外)なのか偽(falseとnil)なのかを判断して、真のときに、<文>を実行します。
実際に書いていきます。

“`
number = 5
if number == 5
puts (‘5です’)
end
“`
説明すると、

1. numberに5を代入します
1. もし、numberが5だったら、’5です’と表示してください

こんな感じになります。このコードを実行すると、真と判断され、’5です’と表示されます。
また、<条件式>が偽と判断されると、<文>は実行されません。

**応用編**

さらに細かく条件を指定したいときは、ifの中にelsifやelseを加えることで指定することが出来ます。

“`
if <条件式1> then
<条件式1>の結果が真のときに実行したい処理
elsif <条件式2> then
<条件式1>の結果が偽で、かつ<条件式2>の結果が真のときに実行したい処理
els

元記事を表示

Rails+ReactでAjaxいいねボタンを作る方法

#はじめに
Ruby on Rails と React を用いてSPAのポートフォリオを作る中でAjaxでいいねボタンを作る必要があったのでその方法をシェアしたいと思います. 細かいcontrollerやmodelの作成については書いておりませんのでご了承ください.
なお, いいねボタンのアイコンにはFont Awesomeを使用します.

“`
【動作環境】
Rails 6.1.4
react-rails の gemを使用
“`

#1. Font Awesome からハートマークをインストール

“`sh
$ yarn add @fortawesome/free-solid-svg-icons
$ yarn add @fortawesome/free-regular-svg-icons
“`
↓公式ページの通りインストール

https://fontawesome.com/v5.15/how-to-use/on-the-web/using-with/react

#2. フロント側の実装

“`react
import React, { useState } fr

元記事を表示

rails serverを実施したときに、pumaについて、mach-o, but wrong architecture

#書いた理由
備忘メモ
何度も同じことが起こるので

#起こったこと

rails tutorialを進める過程で
`rails s`
を実行したとき、コケる

“`
/Users/username/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/activesupport-5.1.6/lib/active_support/dependencies.rb:292:in `require’: dlopen(/Users/username/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/puma-3.9.1/lib/puma/puma_http11.bundle, 9): no suitable image found. Did find: (LoadError)
/Users/username/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/puma-3.9.1/lib/puma/puma_http11.bundle: mach-o, but wr

元記事を表示

正規表現(^, \A, \z \Z, $)の違い

Ruby を使って 正規表現の違いを説明します。

`\A`, `^`, `\Z`, `\z`, `$` は微妙に異なります。

## `/A`

文字列の始まり

### Sample

“`ruby
“abc \n def \n ghi \n”.gsub(/\A.*$/, ”)
# => “\n def \n ghi \n”
“`

文字列の最初から行末までマッチしました。

## `^`

行の始まり

### Sample

“`ruby
“abc \n def \n ghi \n”.gsub(/^.*$/, ”)
# => “\n\n\n”

“abc \n def \n ghi \n”.gsub(/^ .*$/, ”)
# => “abc \n\n\n”
“`

行頭から行末まで、改行を除いてマッチしました。

## `/Z`

文字列の終わり。 改行を含まない。

### Sample

“`ruby
“abc \n def \n ghi \n”.gsub(/.*\Z/, ”)
# => “abc \n def \n\n”
“`

改行を除いた最後

元記事を表示

[Ruby] AtCoder過去問 B – Contest with Drinks Easy

##はじめに
AtCoder過去問B問題をRubyで解いてみました。
よろしくお願いします。

問題はこちらから確認してください↓

https://atcoder.jp/contests/abc050/tasks/abc050_b

##B – Contest with Drinks Easy
まずは入力値を受け取る記述を書きます。今回は少々多めでした。
p_xに関しては(4行目以降)二次元配列として受け取っています。

“`ruby
n = gets.to_i
t = gets.split.map(&:to_i)
m = gets.to_i
px = readlines(chomp: true).map{|line| line.split(‘ ‘).map(&:to_i)}
“`

僕は頭の整理がしやすいように、pとxはそれぞれの配列に入れ直しました。

“`ruby
n = gets.to_i
t = gets.split.map(&:to_i)
m = gets.to_i
px = readlines(chomp: true).map{|line| line.split(

元記事を表示

rails5, rails6以降のchartkicksの導入方法

railsの情報って5が圧倒的に多いですけど、6って意外と情報少ないですよね…
はい。その罠にかかって時間を費やしてしまったわけです。
そこで、railsに見やすいグラフを導入してくれるchartkicksのバージョン別導入方法を記述していきます!
結果から言ってしまうと公式読めば済むことでしたが…。

https://github.com/ankane/chartkick

# 共通手順
gemfileに記述して

“`:gemfile
gem “chartkick”
“`

ターミナルで以下を実行
`bundle install`

gemなのでこの流れは必須ですね。

# rails5のchartkicksの導入手順

headタグに以下を記述

“`html.erb:view/layout/application.html.erb
<%= javascript_include_tag "//www.google.com/jsapi", "chartkick" %>
“`

そして、app/assets/javascripts/application.jsに以下を

元記事を表示

if → unlessへの書き換え

今回はRubyの問題です!

これを解いて理解して行こうと思います!

下記が問題です!

#①.問題

次のif文をunlessというメソッドを用いて書き換えてください!

“`php
if a + b > 0
puts “計算結果は0より大きいです”
end
“`

ヒント!!

unlessとはifとは逆で、条件式がfalseの場合に処理が実行されます!

ifを使用した場合!

“`php
if 条件式
条件式がtrueの時に実行する処理
else
条件式がfalseの時に実行する処理
end
“`

unlessを使用した場合!

“`php
unless 条件式
条件式がfalseの時に実行する処理
else
条件式がtrueの時に実行する処理
end
“`

#②.解答

“`php
unless a + b <= 0 puts "計算結果は0より大きいです" end ``` #③.解説 まず問題のコードについて解説を行います! a + b > 0という式は、「a + b が0より大きいとき」にtrueとなり、

その結果e

元記事を表示

hidden_fieldを使いたくなかったから、試行錯誤した話

# 寝て起きたら閃いた
撲滅したかった部分のコード

“`rb
<%= f.hidden_field :list_id, value: @list.id %>
“`

外部キーをフォームに持たせるために使っていたがデベロッパーツールで改ざんされるのを防ぐため撲滅することにした。
ああでもないこうでもない、色々と試行錯誤したがストロングパラメーターのあるprivateメソッド内で書くことが一番だと考え、ストロングパラメーターに含めたら、最終的に以下のコードになった。

“`rb
private
def card_params
params.require(:card).permit(:title, :memo).merge(list: find_list)
end

def find_list
@list = List.find(params[:list_id])
end
“`

全体のコード
view

“`rb
<%= form_with model: @card, url: list_card_index_path,

元記事を表示

Railsのhas_manyのデフォルトの挙動

↓以下のコードを例にします。

“`ruby
class User < ApplicationRecord has_many :microposts, dependent: :destroy end ``` **「has_many :microposts, dependent: :destroy」**とすると**Userモデル**と**Micropostモデル**を1対多の関係に紐づけてくれますが、特に**「Micropost」**という記述がなくても動作します。これはデフォルトの挙動のおかげです。 デフォルトでは、「:microposts」の部分を**「{モデル名}s」**と推測します。 つまり**「:microposts」⇨ 「{Micropost}s」**としMicropostモデルと紐づければいよいとrailsが理解してくれます。 紐づけるキー、つまりforeign_keyに関しても**「{モデル名}_id」**がforeign_keyであると推測してくれます。 今回だと、**「user_id」**がforeign_keyであると推測します。 ```ruby cla

元記事を表示

ransackを用いて複数ワードの空白区切り、フリーワードでの検索機能を実装する

## はじめに
開発ですぐに忘れそうなことを、簡単に再度調べられるようにするための備忘録です。

## やりたいこと
検索機能を簡単に実装できるransackを用いて、
複数のワードを空白区切りで入力された時の検索と
カラムを跨いだフリーワードでの検索を実装したい。

## 事前知識

例えば、Blogモデルにransackを用いて検索機能を実装する流れとして、

– カラム名_eq, カラム名_contなどのパラメーターを渡す( `params[:q][:title_cont]`など )
– `Blog.ransack(params[:q])`で検索
– 検索で得られたオブジェクトに対して`result`を用いて、ActiveRecord_Relationに変換する

のような流れで実装していく。

その他、細かな点は[ソースコード](https://github.com/activerecord-hackery/ransack)や[ピカワカ](https://pikawaka.com/rails/ransack)さんのサイトが参考になりそう。

## 実装の流れ

1. 入力された

元記事を表示

Ruby Kaigi Takeout 2021 に参加してきました

Ruby Kaigi Takeoutに参加したので遅まきながらレポートを完結に書きました。
私の経歴としては学生時代は趣味でコードを書いていて新卒で入った会社でRuby on Railsでの開発を1年半ほど経験(継続中)で今に至るといった感じです。

今回は初日から最終日まで参加して特に印象深かった発表を3つほどご紹介したいと思います。

## TypeProf for IDE: Enrich Dev-Experience

Ruby3から追加されたRBSを利用して型推論でautocomplete、型エラーの報告、RBSの自動生成などができるVSCodeプラグインの話でした。

個人的に便利だと感じたのはRBSの自動生成で、Ruby3のRBSの発表を見たときに別ファイルに型定義を書いておくのは若干めんどくさいのではないかと感じていたのでぜひ使ってみたい機能です。

TypeProf

元記事を表示

Ruby aliasとalias_methodについて

#aliasとalias_methodとは
この2つはRubyでメソッドに別の名前をつけるためのものです。

#両者の違い

⚫︎“`alias“`はグローバル変数に別名をつけることができ、キーワードみたいです。
⚫︎“`alias_method“`とはメソッド名に文字列が使えて、メソッドであるみたいです。

#書き方
下の参考資料の引用になってしまうのですが、下記が書き方です。

“`
alias 新メソッド名 旧メソッド名
alias 新グローバル変数名 旧グローバル変数名
“`

“`
alias_method 新メソッド名, 旧メソッド名
“`

どのように使われるかというと

“`memos_controller.rb

def subtitle
puts “Ruby学習”
end

alias title subtitle  #キーワードとして実行される

title # => “Ruby学習”
# titleはsubtitleのaliasになっているため、subtitleが実行

“`

“`memos_con

元記事を表示

Ruby reduce(inject)を使用して計算

# 配列の要素をどんどんたたみ込んで計算

配列内の要素を合計する時に、以下のようなコードを書いていた。

“`
def sum(array)
sum = 0
array.each do |number|
sum += number
end
return sum
end
p sum([5, 10, 20])
# => 35
“`
初期値 = 0 の設定、イテレートの記述でもっさり。
reduceメソッドを使用すると、sumメソッド内のコードを1行に減らすことができる。

“`
def sum(array)
array.reduce(0) { |sum, num| sum + num }
end
p sum([5, 10, 20])
# => 35
“`
さらに、リファクタリングできる。ただし、.reduce(:+)は.sumとほぼ同じなので以下の2つは同じ結果になる。

“`
def sum(array)
array.reduce(:+)
end
p sum([5, 10, 20])
# => 35
“`
“`
def sum(arra

元記事を表示

【ちょっとした実験】ゲームのバトルマッチシステムの妥当性をシミュレーションする

# 概要
いわゆるソシャゲーというものの多くにはプレイヤー対戦やチームバトルというのがあります。
**とあるゲーム** のチームバトルは下記のように運営されます。

* 「ランク」の同じチームがマッチングされる(きっとランダム)
* ランクはS,A,B,C,Dとある
* 3回勝つとランクアップし、3回負けるとランクダウンする
* ただしSランク以上にはならない。また、Cランク以下にもならない。(D→Cは上がるだけっぽい)

ここで個人的に謎だったのは、負けても勝利回数は減らないし、逆に勝っても敗北回数は減らないというところ。
これでランク間に変な偏りが発生したりしないんだろうかと検証したくなりました、という話。

単純なプログラムなので特に技術的に面白いことはないです。

# 検証
## シミュレーションのためのモデル化

バトルの勝ち負けは戦術や相性などにも影響されますが、そういうのは省いて下記のような単純なモデルを考えシミュレーションします。

* 5000のチームがある
* チームは順番に1,2,…5000の戦闘力を持ち、それは変動しない
* シミュレーション開始時点

元記事を表示

[Ruby] AtCoder過去問 C – Tax Increase

##はじめに
AtCoder過去問C問題をRubyで解いてみました。
よろしくお願いします。

問題はこちらから確認してください↓

https://atcoder.jp/contests/abc158/tasks/abc158_c

##C – Tax Increase
まずは入力を受け取ります。
最終的に答えとなる変数ansを用意して、条件を満たす税抜き価格が存在しなかったときに出力する-1を代入しておきます。

“`ruby
a, b = gets.split.map(&:to_i)

ans = -1
“`

続いて消費税は制約からmax100とわかります。つまりmaxの税抜き価格は1000だということです。
1000程度であったらeach文で回せるので1~1000をeachで回してそれぞれの消費税を求めてその答えがaとbと等しいかif文で分岐させます。

ほとんどがfalseを返しますが、trueになったときにansを書き換えてbreakで処理を抜け出します。

最後にansを出力すれば完成です。

“`ruby
a, b = gets.split.map(&:to_

元記事を表示

OTHERカテゴリの最新記事