Ruby関連のことを調べてみた2020年06月30日

Ruby関連のことを調べてみた2020年06月30日

レコードの新規追加時に登録データにMAX+1のIDを付与する方法

Railsでレコードの新規追加をする際に、自動的に独自IDの付与をしたいケースがあると思います。
例えば、my_idフィールドの最大値+1を付与するなど。

部屋(room)の名前を登録したときに、独自id = my_id を付与するサンプルを書いてみました。

## 成功例

“`ruby
def assign
my_id = -1
room = Room.find_by(room: params[:room])
if !room.nil?
my_id = room.my_id
else
Room.connection.execute(
“INSERT INTO rooms (my_id, room, created_at, updated_at) SELECT COALESCE(max(my_id), 0)+1, ‘#{params[:room]}’, ‘#{Time.now}’, ‘#{Time.now}’ from rooms”
)
my_id = Room.find_by(r

元記事を表示

【整理】render&redirect_toが、ごっちゃになってしまうあなたへ

#対象者
なんかredirect_toとかrenderとかそれぞれどんな違いあるんだっけ?使い方は?と、知ってるけど頭の中で整理できていない方

#前提知識
Railsのコントローラにおけるアクションでは、最終的にrenderされてビューを返す仕組みになっている。
つまり、**1アクションにつき、1render**が必ず起こる。

“`
def index
end
“`

これは、render ‘index’が発動していることと同じことである。

##エラー例
renderが2回処理されてしまう時

“`
def show
~~
if ~~
~~
render ‘index’
end
render ‘show’
end
“`

解決策としては、returnをしてあげる

“`
def show
~~
if ~~
~~
render ‘index’
return
end
render ‘show’
end
“`

#render
アクション内で、呼び出すビューを指

元記事を表示

【Ruby+Nokogiri】でyahooニュースをスクレイピング→CSV保存

以前Pythonの**BeautifulSoup**を使ってスクレイピングをしたことがあったのですが、Rubyでも**Nokogiri**というライブラリで実現できるということで試してみました。

でまずは完成コード、完成品から

“`ruby:scraping.rb

require ‘nokogiri’
require ‘open-uri’
require “csv”

require “byebug”

url_base = “https://news.yahoo.co.jp/”

def get_categories(url)
html = open(url)
doc = Nokogiri::HTML.parse(html)
categories = doc.css(“.yjnHeader_sub_cat li a”)
categories.map do |category|
cat_name = category.text
cat = category[:href]
end
end

@cat_list = get_categories

元記事を表示

Rubyスクレイピング-VPSでSeleniumをHeadlessに動かす。

#開発環境
ruby2.7.1
centos7

#手順

###①Gemを追加しよう
`gem install gem install selenium-webdriver`
###②GoogleChromeをインストール
インストールする
`yum install google-chrome-stable`
バージョン確認しておく
`google-chrome -version`
###③GoogleChromeをインストール
http://chromedriver.chromium.org/downloads からgoogle-chromeと同じバージョンのChromeDriverをダウンロードする

下記はGoogleChromeがバージョン83.0.4103.39のコマンド
`wget https://chromedriver.storage.googleapis.com/index.html?path=83.0.4103.39/`

展開
`unzip chromedriver_linux64.zip`
移動
`sudo mv chromedriver ~/usr/loc

元記事を表示

消せないプロセスID(PID)の消去方法!(Vim、Viでの操作不能の対処)

**$ sudo visudoのコマンド入力できなくなり凄く困ったので解決方法を記載します!**

 何かの不具合で、`.ssh % `の状態もしくは`[ec2-user@ip-xx-x-x-xxx] $`から強制終了されるとターミナルでのコマンド入力ができなくなる時があります。

 私も、過去に似たような経験をしたことがあり、多分**プロセスID**が正常に切られなかったため、`ec2-user `にログインした際、`$ sudo visudo`が入力できないと予測しました。
**発生したエラーは下記です**

“`言語:エラー文
visudo: /etc/sudoers がビジー状態です。後で再試行してください
“`

 この問題を可決するのに凄く時間を費やしたので、プロセスID(PID)の**一般的な消去方法**と**プロセスID(PID)が無限に増殖する際の消去方法**について記載したいと思います。

# 1. 基本のプロセスID(PID)の消去方法!

**1. ターミナルでルートディレクトリーに移動する。または、`.ssh % `の状態もしくは`[ec2-user@ip

元記事を表示

[RubyOnRails]テーブルデータを基にform_withにプルダウンを実装する方法

# 内容
form_withにプルダウン選択を導入しようと思い実装していく中で、何個かトライアンドエラーを繰り返した所があったので、備忘として残しておくもの。

# 環境
・Ruby 2.6.5
・Rails 6.0.3

# 前提の状況とやりたいこと

### 状況
飲食店の情報を登録するshopテーブルがある。
山手線の駅データをリストとして入れたstationテーブルがある。
二つのテーブルは多対多の関係にあり、中間テーブル(shop_stationテーブル)を介してアソシエーションを組んでいる。

### やりたいこと
以下の機能を実装したい。
**①shopデータ作成時に、最寄り駅をプルダウンで選択し登録したい。**
**②最寄り駅の登録は任意で登録しなくても良い。登録できるのは最大で2駅まで。**
**③当然、一回のフォーム送信で一度に全ての最寄り駅を登録したい。**

上記の実装手順を備忘として残していく。

※ちなみに、静的なデータを登録する場合はテーブルをいちいち作るのではなくアクティブハッシュでリストを生成することがベターという記事をいくつも読んだのですが、

元記事を表示

数値を使わず 3 で割った余りを求める

# お題

0 以上の整数が**文字列として**与えられ,それを 3 で割った余りを返す関数なりメソッドなりを定義せよ。この記事では Ruby を使うので,メソッドですね。

ただし,数値は一切使わないこととする。つまり,処理の途中で数値オブジェクトを使ったりしない。当然ながら返り値も文字列とする。

組込みのメソッドが内部で数値オブジェクトを生成していないか分からないので,自分で書いたコードが途中で数値オブジェクトを作っていなければよいことにする。

メソッド名を `remainder_modulo_3` と名付けよう。英語が合ってるかよく分からんけど,remainder は剰余のことで,modulo 3 は「3 で割ったときの」という意味[^modulo3]。

[^modulo3]: modulo 3 は,正式な数学の用語では「3 を法として」と言う。

以下のようになればいい:

“`rb
p remainder_modulo_3(“0”) # => 0
p remainder_modulo_3(“8”) # => 2
p remainder_modulo_3(“12”

元記事を表示

Kinx ライブラリ – JIT ライブラリ

# Kinx ライブラリ – JIT ライブラリ

## はじめに

**「見た目は JavaScript、頭脳(中身)は Ruby、(安定感は AC/DC)」** でお届けしているスクリプト言語 [Kinx](https://github.com/Kray-G/kinx)。JIT コンパイルのためのライブラリを作ってみました。

* 参考
* 最初の動機 … [スクリプト言語 KINX(ご紹介)](https://qiita.com/Kray-G/items/ca08b6fb40d15dd0ec76)
* 個別記事へのリンクは全てここに集約してあります。
* リポジトリ … [https://github.com/Kray-G/kinx](https://github.com/Kray-G/kinx)
* Pull Request 等お待ちしております。

JIT やりたいよね。今回は [Kinx – native](https://qiita.com/Kray-G/items/66257e4cca0ad6dd7636)

元記事を表示

【Ruby on Rails】レイアウトテンプレートの備忘録

初稿です。不備がありましたらご指摘いただけると幸いです。

Ruby on Railsを勉強中です。ビューファイルでコーディングした内容が、なぜDOCTYPE宣言やHTMLタグで囲ってないのにブラウザできちんと表示されるか不明だったのですが、レイアウトテンプレートを理解してスッキリしたので備忘録として残しておきます。

# レイアウトテンプレートとは?
railsでアプリケーションを作成した際に、以下のディレクトリに自動で作成されるファイルです。
**app/views/layouts/application.html.erb**

通常、コントローラーで定義したアクションから、ビューファイルがある場合はそのファイルが呼ばれているように見えますが、実際はレイアウトテンプレートの中に作成したビューファイルが埋め込まれて返しているとのこと。

例)postsというコントローラーを作成した場合
app/controllers/posts_controller.rb

“`ruby:posts_controller.rb
class PostsController < Application

元記事を表示

【Rails】画像プレビュー機能の実装

# 目標
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579893/1dd19b79-c7b2-21c0-b120-d4f9645018e6.gif)

# 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# 前提

下記実装済み。

・[Slim導入](https://qiita.com/matsubishi5/items/b639ffddecc626856039)
・[Bootstrap3導入](https://qiita.com/matsubishi5/items/b117c95f4dd71340cc80)
・[Font Awesome導入](https://qiita.com/matsubishi5/items/a4c72f436e64ad106ee8)
・[ログイン機能実装](https://qiita.com/mats

元記事を表示

【RSpec】stub_request(:post)でスタブ化したGoogle APIへのリクエストのレスポンスを実際と同一の形式にする

タイトルが長い

RailsアプリケーションからGoogle Calendar APIでカレンダー上のイベントに対して更新処理を行い、そのレスポンスから特定の属性を取り出して取り回すような処理を追加した。
レスポンスで受け取ったJSONをgoogle-api-ruby-clientがGoogle::API::V3::Eventクラスのオブジェクトに変換してしまうため、スタブリクエストのレスポンスもruby-clientで変換させるか同様の構造を持ったオブジェクトにする必要があった。

# TL;DR

– google-api-ruby-clientを利用してGoogleAPIにリクエストした場合、レスポンスはJSON形式で返ってきたあとgoogle-api-ruby-clientで変換される
– stub_requestからの戻り値のヘッダーに `’X-Goog-Upload-Status’: ‘final’` を加えると実際のAPIからのレスポンスと同様の形式になる

# スタブ化したリクエストと実際にAPIにリクエストした場合のレスポンスの違い

下記のコードはgoogle-ap

元記事を表示

[Rails]seedファイルごとにデータを管理する

某フリマアプリのクローンサイトをチームで作成中です。
その時に、seedファイルの扱いに少し困ったので備忘録として残しておきます。

# したいこと
商品を出品する時に、「商品の状態」「配送料」..etcなんかは、
データベースに先に値を入れておいて、プルダウンから選択できるようにする

こんな感じ
![スクリーンショット 2020-06-29 17.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656249/c26de7ab-f8f8-d07d-fd8e-e3127a0b2e50.png)

# 実装
##1. rake taskの作成
lib/tasks/直下にseed.rakeを作成し、以下を記載

“`ruby:lib/tasks/seed.rake
Dir.glob(File.join(Rails.root, ‘db’, ‘seeds’, ‘*.rb’)).each do |file|
desc “Load the seed data from db/seeds/

元記事を表示

To install the missing version, run `gem install bundler:2.1.4`と出たときの対処法

日々学んだことやぶち当たったエラーについてまとめていきます。
記載に誤りがありましたら、ご指摘していただけると助かります!
いつも他のかたの記事に助けられているので、少しでもお役に立てればと思います。
##どういうエラーなのか
Gemfile.lockにbundler 2.1.4が指定しているが、そのバージョンのbundlerが見当たらないというエラー。

“`
Traceback (most recent call last):
2: from
1: from
#省略
Could not find ‘bundler’ (2.1.4) required by your /Users/<ユーザー名>/<ルートディレクトリ名>/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update –bundler`.
To install the missing version, run `gem install

元記事を表示

bcrypt導入時のエラーたち

#bcrypt導入時のエラー
パスワードを暗号化するためのgem, bcryptを導入する際に起こった、小さなエラーの解決法まとめです

#その1 An error occurred while installing bcrypt, and Bundler cannot continue.
“`ruby:Gemfile
gem ‘bcrypt’
“`
と書き足し、bundle install を実行したところ、
![5A9EC28E-C920-4220-8E26-235FCFFCA819_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429131/03721c09-3698-fc3c-83d3-c18365f5af89.jpeg)
An error occurred while installing bcrypt (3.1.13), and Bundler
cannot continue.
というエラーが発生。
続けて、エラーメッセージ内に書いてある、
gem install b

元記事を表示

ActiveRecordを使うときは頭にSQLを描こう

みなさん、ActiveRecordを使う時に頭にSQLが浮かんでいますか?

ActiveRecordはとても便利でSQLを意識することなくDBにアクセスしてデータを取得したり、更新したりすることができます。
そのためついつい実装時にSQLを意識せずに書いてしまうことがあります。

実装時はActiveRecordを使うことで素のSQLを意識しなくてもよいのですが、最終的に実行する時にはSQLが実行されています。
そのため実際に発行されるSQLをみると、こんなSQL発行されるのと驚くことがあります。

SQLを思い浮かべながら書いていたら回避できる実装例をいくつか挙げてみます。

# 無駄なテーブルをJOINしている

下記のようなモデルがあったとします。

“`ruby
def User < ApplicationRecord has_many :user_organizations end def UserOrganization < ApplicationRecord belongs_to :user belongs_to :organization end d

元記事を表示

[Rails]Ransackでセレクトボックスを使用する方法

# はじめに
Ransackで、セレクトボックスを使用する方法についてまとめていきます。

# selectについて
まずは、セレクトボックスを作るための`select`ヘルパーについて、説明をしていきます。

#### 基本型

“`erb
select(オブジェクト, プロパティ名, 要素情報, オプション, 要素属性)
“`

#### 実装例
“`erb
<%= f.select :name, [['sample1', 1], ['sample2', 2], ['sample3', 3]], {include_blank: '選択なし'}, class: 'sample' %>
“`

(form_forの中に入っているとして、オブジェクトは入れていません。)
このように、第三引数に配列を入れると、パラメータとして`valueの1や2が送信されます`。

# 便利なヘルパー
さらにセレクトボックスをカスタマイズしていくための`便利なヘルパー`があります。

### options_for_select
`セレクトボックスの初期値`を設定したいときは`options_

元記事を表示

Rubyのクラスメソッドって何?

# はじめに

Rubyでつまずいた項目のひとつ、クラスメソッド。
わからなかったことを書いていきます。

クラスとインスタンスについては[こちら][link-1] 。
[link-1]:https://qiita.com/fishmans0120/items/569cd9ab37b89c0c1726

# メソッドとは

前提条件として、メソッドとは何か。
メソッドとは、データが持つ「動作」です。

車に当てはめて考えてみると、
車というデータが持つ動作は「走る、止まる、ウィンカーを出す」などです。

# クラスメソッドとは

クラスメソッドを定義したクラス自身が使えるメソッド。
クラスで共通の情報を持った処理に使うことができます。
定義の方法は他のメソッドと同じですが、メソッド名の前に.selfをつけます。

“`ruby:test.rb
class Car
def self.run # メソッド名の前にselfをつけてクラスメソッドを定義します
puts “走ります”
end
end

Car.run # クラス名.メソッド名で、定義したクラスメソッドを実行でき

元記事を表示

間違えやすいpathの見極め方

# pathの見極め方
path名を探す時、普段使うのはターミナルでrails routesして、

Prefix Verb URI Pattern Controller#Action
new_admin_session GET /admins/sign_in(.:format) admins/sessions#new
admin_session POST /admins/sign_in(.:format) admins/sessions#create
destroy_admin_sess

元記事を表示

Rubyの繰り返し処理で添字を任意の番号から始める方法

# はじめに
タイトルのとおりですが、Rubyで配列をeach_with_indexで繰り返す際に添字を任意の番号から始める方法が個人的に便利だったので、やり方を残しておこうと思います。

# やり方
`each_with_index`を`each.with_index(n)`にするだけです。
nには開始番号を指定してください。
添字を1から始める場合は以下のように書きます。

## コード

“`
juices = [“tea”, “cola”, “coffee”]
juices.each.with_index(1) do |juice, i|
puts “#{i}番目:#{juice}”
end
“`

## 出力結果

“`
1番目:tea
2番目:cola
3番目:coffee
“`

`each_with_index`だと`i+1`などとする必要があるので、今回の方法だと地味に便利ですよね。

元記事を表示

【devise】rails メモ 基本設定 初期設定

##【ゴール】
devise 初期、基本設定まとめ
意外と、ごちゃっとなってしまうので、、、

##【メリット】
■ 作業効率UP
■ devise理解度向上

##【開発環境】
■ Mac OS catalina
■ Ruby on Rails (5.2.4.2)
■ Virtual Box:6.1
■ Vagrant: 2.2.7

##【コマンド】
####deviseを初期化
“`
$ rails g devise:install

※エラーが出れば、
$ bundle exec spring stop
“`

####modelを作成
“`
$ rails g devise:アプリ名
“`
####各viewを作成
“`
$ rails g devise views アプリ名
“`

####各controller作成
“`
$ rails g controllers devise:アプリ名
“`

####メール承認機能作成の場合
※Confirmableのコメントアウト外す

“`db/migrate/devise_creat_アプリ名.rb
##

元記事を表示

OTHERカテゴリの最新記事