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

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

railsでアプリ名を確認する方法

“`
# bundle exec rails c
Loading development environment (Rails 5.1.6)
“`

“`
> File.basename(Rails.root.to_s)
=> “server”
“`

元記事を表示

【Docker】Rails+MySQLの環境をDockerで構築中「ポートの衝突」に遭遇してから解決するまで

## はじめに
Dockerで**Ruby on Rails + MySQLの環境**を構築中にいわゆる**「ポートの衝突」**に遭遇したので解決までを記載します。

同じような箇所でハマった方の参考になればと思います。

## この記事が役に立つ方
– DockerでRails+MySQLの開発環境を行いたいと考えている
– Docker初心者

## この記事のメリット
– ポートの衝突を回避する方法が分かる

## 環境
– macOS Mojave バージョン10.14.6
– シェル:zsh
– Ruby:2.6.5
– Rails:5.2.2
– MySQL:5.7
– Docker:19.03.5

## Dockerfile

こちらを参考に、rubyのバージョンのみ、現行安定版である**2.6.5**にしています。
[丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac) – Qiita](https://qiita.com/azul915/items/5b7063cbc80192343f

元記事を表示

気象×Ruby 〜Mechanizeを使ってRubyスクレイピング〜

#今回の試み
###・ 気象データAMeDASの10分ごとの値を一気に取得する
###・ PythonとRubyの両方でスクレイピングしてみる

スクレイピングするデータは[こちら](https://www.data.jma.go.jp/obd/stats/etrn/view/10min_s1.php?prec_no=44&block_no=47662&year=2019&month=01&day=01&view=p1)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354874/13bf9771-17c0-c790-a403-251492816bfa.png)

#1. Pythonによるスクレイピング
“`python
# -*- coding: utf-8 -*-
import pandas as pd
import urllib.request
from bs4 import BeautifulSoup

url = ‘https://www.data.jma.go.jp/ob

元記事を表示

大学生のプログラミング学習日記

## スタート
今日から日々学んだこと等を書いていこうと思います。
ミス等たくさんあると思いますが、ご指摘頂けると嬉しいです。

自己紹介
・ケンシロウ
・北海道大学2年
2019年8月から2ヶ月間、techacademyにてwebアプリケーションコースを受講し、rubyとrubyonrailsを学習。
受講終了後、簡単なブログ機能を持ったアプリを作成。
12月から、札幌web系スタートアップ会社でインターン予定。

将来はプログラミングスキルだけでなくいろいろなスキルをつけ、自分でサービスを作って提供したい。

元記事を表示

入力された数値を素因数分解するコードをRubyでprimeライブラリを用いずに書いてみた

## はじめに

Rubyで、入力された数値を素因数分解するコードを書きました。

[primeライブラリ](https://docs.ruby-lang.org/ja/latest/library/prime.html)というライブラリを用いる方法もあるようですが、このライブラリを用いずに書かれたRubyでの素因数分解に関するコードがググっても案外見当たらなかったので、あえて用いずに書いたコードを下記に示します。

こちらの記事を参考にさせていただきました:[C言語で素因数分解](https://qiita.com/Wakaba_C/items/16d076ef2cc07836a29d)

## 書いたコード

(2019.11.22 @scivola さんから、無駄な記述や、無駄にforループを回してるところについてのご指摘をいただき、コードを修正しました。@scivola さん、ありがとうございます。)

~~~ruby:prime_factorization.rb
prime_list = [] # 算出された素数を格納する配列

while true do
print “

元記事を表示

RSpecで可変長引数のテストがしたいとき

動作確認環境: Ruby: 2.6系, Rspec: 3.8系, OSは問わないはずw

# こんなとき
たとえば、グループで必須チェック(グループ内のいずれにも値が設定されない場合にエラーとする)を行うメソッドを作ったとき

“`rb

require ‘active_support’
require ‘active_support/core_ext’

class Validator
def required_group(data, *columns)
joined_columns = columns.join(‘と’)
flg_present = false
columns.each do |column|
flg_present |= data[column].present?
end
return “#{joined_columns}のうちいずれか1つは入力必須です” unless flg_present
end
end
“`

RSpecではこう書くとよろしい

“`rb

describe Valid

元記事を表示

【Rails】パーシャルを利用する

Railsではviewファイルで使う部品(パーシャル)を作り、他のviewファイルから呼び出して利用することができます。
##パーシャルの基本ルール
・ファイル名はアンダースコアから始まる
・`render ‘{ファイル名}’`で呼びだす
・パーシャルが同じディレクトリにある時は`render ‘{ファイル名}’`、違うディレクトリの時は`render ‘{ディレクトリ名/ファイル名}’`で呼びだす。(拡張子不要)

##使ってみる
簡単なTODOアプリのエラーメッセージをパーシャル化して利用します。
・[Ruby on Railsで簡単なアプリを作成](https://qiita.com/d0ne1s/items/5e63dde992f20f25b8bb)
・[TODOアプリにバリデーションを追加する](https://qiita.com/d0ne1s/items/822f66d16d65ae28162b)
###パーシャルを作成
“`erb:/app/views/shared/_error_messages.html.erb
<% if @task.errors.any? %>

元記事を表示

【Rails】TODOアプリにバリデーションを追加する

[シンプルなTODOアプリ](https://qiita.com/d0ne1s/items/5e63dde992f20f25b8bb)にバリデーション(入力制限)を追加していきます。

バリデーションは`create`、`save`、`update`などのメソッドが呼び出されたタイミングで実行されます。

##バリデーションを追加する
タスクの最大文字数を20文字に設定するバリデーションをmodelに記述します。
文法は`validates :{カラム名}, {ルール名}: {ルールの内容}`です。

“`/app/models/task.rb
class Task < ApplicationRecord validates :title, length: {maximum: 20} end ``` ##エラーメッセージを表示する バリデーションに失敗するとfalseが返され、`@{オブジェクト名}.errors.full_messages`でエラーメッセージの配列を取得することができます。 まずはControllerを修正し、エラーが発生した場合時にトップページに移動しないよ

元記事を表示

Railsで外部キー追加時に「型の不整合」で失敗する場合の対応

# 環境

– Rails 5.2.2.1

# エラー内容

`add_foreign_key`などで外部キー制約をつけようとすると、`rails db:migrate`が失敗して以下のエラーが出る。

“`ruby
Mysql2::Error: Referencing column ‘user_id’ and referenced column ‘id’ in foreign key constraint ‘fk_rails_85591c599e’ are incompatible.
“`

# 原因

「外部キー(`user_id`)」と「参照先テーブルのカラム(`users`テーブルの`id`)」の型が異なっている。
よくある例としては、`Rails5.1`から`id`カラムが`bigint`になったが、過去に作成したテーブルの`id`カラムが`int`のままの場合。

# 対応方法

`id`カラムを`bigint`にする。

“`ruby:db/migrate/20190000000000_xxx.rb
class SomeMigrationFile < Active

元記事を表示

Ruby小ネタ2

現場のプロジェクトでよく使い、でも初心者な自分は知らなかったあれこれ。

## pluck
指定したカラムの値を配列として戻します。

“`Ruby:
HogeModel.pluck(:id)
# => [1,2,3]
“`

なにが便利かというと、配列になっているので`include?`とか`any?`が使えます。
処理中に出てきた変数と比べられたり、where句の問い合わせにそのまま入れられたり(配列になっているので、Railsはin句として処理してくれる)。

## 子モデルの値に対するwhere句
親モデルに対するwhere句は`where(colum: ‘a’)`で書けますが、それでは子モデルは?

“`Ruby:
AModel.joins(:BModel).where(b_models: {bcolum: ‘b’})
# => SELECT a_models.* FROM a_models INNER JOIN b_models ON a_models.id = b_models.a_id WHERE b_models.bcolum = ‘b’
“`

意外に初心者

元記事を表示

Rubyのtapの動きと使い方

既出ネタですが、自分の頭を整理するためにアウトプット。

## tapとは
ブロックにレシーバ自身を入れてブロックを実行。
戻り値にレシーバ自身を返す。

## どんな動きか
レシーバーについて何かしたいけど,したあとそのレシーバーがほしい。
と言われてもよく分からなかったので、こちらの記事がとても分かりやすかったです。

とても分かりやすかった記事はこちら。
[Ruby | tap がよく分かってなかったので基本を調べてみた](https://qiita.com/YumaInaura/items/6c32f0568aa23f83313a: “Ruby | tap がよく分かってなかったので基本を調べてみた”)

“`Ruby:
a = 1
a.tap { |i| i*3 }
put a
# => 1
“`

このコードだと、aにいれた1をtapの中で3倍しているけど、aはなにも変わってない。

## 具体的になにに使えるか
こちらの記事にあった用途で、実際のプロジェクトで使いました。
[Rubyのtapメソッドが便利なので紹介する](https://www.te-nu.com/e

元記事を表示

VCRのmatch_requests_onを変更する

# 背景

[VCR](https://github.com/vcr/vcr)というHTTPリクエストをモックするGemがあります。Rubyのテストコードで使います。

VCRでは設定ファイルに、HTTPリクエストとそれに対応するレスポンスの組合せを記述し、モックを作成します。VCRを有効にしてテストコードを実行すると、VCRは、次のように動きます

1. テスト実行中に送信されるHTTPリクエストを監視します
2. HTTPリクエストの送信を見つけると、設定ファイル内のHTTPメソッドとURIが一致する、HTTPリクエストを探します
3. HTTPリクエストが見つかれば、そこに記述されたHTTPレスポンスを返します。

また、設定ファイル中に一致するHTTPリクエストが見つからなかった場合は例外を上げます。
意図していないHTTPリクエストを送信したことが検出できます。

他のWeb APIに依存したRubyアプリケーションを開発するときに重宝します。

# 問題
デフォルトのHTTPリクエストの一致条件は、HTTPリクエストのメソッド名とURI文字列です。

GETリクエストの場合

元記事を表示

Rubyでboard APIを叩く

# boardとは
https://the-board.jp/
>受託ベンチャーを支えるバックオフィス業務システム

ソース:[boardが目指しているもの〜バックオフィス業務のために起業したのではない](https://the-board.jp/blogs/goal_of_board)

その[公式提供API](https://developers.the-board.jp/doc/index.html)をRubyで叩きます。

# 算出したいデータ
[1] 見積中の案件について、合計額を算出する
→ 見込み売上
見積には「確度低/中/高」という区別がつけられるので、それで仕分けもする

[2] 受注後〜請求前の案件について、合計額を算出する
→ 確定売上

[3] 請求済みの請求について、合計額を算出する
→ 売掛金

出力例

“`
見積中(高): ¥ 1,000,000
見積中(中): ¥ 2,000,000
見積中(低): ¥ 13,000,000
確定売上: ¥ 4,000,000
売掛金:  ¥ 5,000,000
“`

# APIキー、APIトーク

元記事を表示

#Ruby で n個の配列の中からランダムにx個の要素を取り出す例

“`rb
[*1..100].shuffle.sample(3)

# => [23, 56, 1]
“`

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2747

元記事を表示

サ変名詞を文節で取り出す

大学の授業で使う必要があったため「名詞,サ変接続」から始まる文節を取り出すものを書いてみました。日本語文法の知識を持っていないため勘でやっています。

#コード
“`ruby
require ‘MeCab’
tmp=”nil”
count=0
hantei=0
file = open(“all_hyouka.txt”)
lines = file.read().split(“\n”)

File.open(“phrase_data.rb”, “w”) do |f|
lines.each do | line |
sentence = line
begin
model = MeCab::Model.new(ARGV.join(” “))
tagger = model.createTagger()
n = tagger.parseToNode(sentence)
while n do
if tmp!=”nil”
if n.feature.split(“,”)[0]==”動詞” and n.feature.spli

元記事を表示

Form_forでプルダウンメニューの項目をDBから選択する

##概要

select_tagによる、決め打ちの選択肢 ↓
`<%= f.select :subject, [["1", "1"], ["2", "2"]] , class:"form-control" %>`
**ではなく**、DBのテーブルから項目を引っ張ってきたい時 :fist_tone4:

## 今回の例

都市を入力するページで、国をプルダウンで選択させたい。
Countries (国のテーブル) ※数が増えることがないので`db/*seed.rb`に記載済み。

| id | name |
| —- | —- |
| 1 | Australia |
| 2 | Canada |
| 3 | Japan |

has_many :cities
国は都市をたくさん持っています。

Cities (都市のテーブル):tokyo_tower: :shinto_shrine: :metro:

| id | name | country_id |
| —- | —- | —- |
| 1 | Tokyo |

元記事を表示

namespace / 指定ディレクトリ以下にコントローラーを作成

## 概要

コントローラーやビューを生成する時、
**それぞれ同じ名前になってしまうコントローラー名やビューの名前がある。**
例えば、`user` `photographer` `admin` ぜんぶContacts.controller(お問い合わせ用)を持っています。

そこでディレクトリを指定してコントローラーを生成してあげたら、
**admins**ディレクトリ下にあるものは**admins/contacts**というURLとして呼び出してくれると思ったわけですが・・

ここでルーティング内の重複はどうなるんだ〜となりました。
そこでnamespace(名前空間)という便利なものを知ったのでメモします:sunny:

## Namespace(名前空間)とは

名前の重複があるときに、衝突を防ぐために使用します。

##前提

今回はgem deviseでログイン機能を実装したため、
すでに`$rails g devise:controllers admins`コマンドで`admins`ディレクトリがあります。
そこにdevise関連ではないコントローラーも追加していきた

元記事を表示

undefined method ***_pathの解決策

学習の記録 :writing_hand_tone4:

“` ***/edit.html.erb
<%= form_for @*** do |f| %>
# 省略
<% end %>
“`

“`
NoMethodError undefined method `***_path’
“`

が出てしまう現象が発生。
ルーティングを確認してもパスは合っている・・なぜ :sweat:

##原因

form_forが自動的に生成してくれるパスは複数形のみらしい。

“`
$ rails routes
# resourcesが生成してくれたroutes
edit_admins_単数形 GET /admins/複数形/new(.:format)

# form_forが欲しかったroutes
edit_admins_複数形 POST /admins/複数形/new(.:format)

“`

##解決法

urlを指定して、こっちに飛ぶんだよ〜と教えてあげる :fist_tone4:

“` ***/edit.html.erb
<%= form_

元記事を表示

ER図 と アソシエーションを100%理解する

##概要

モデル同士の繋がりを指す**アソシエーション(関連付け)**:paperclips:
定義しておくと***モデルをまたいだデータの呼び出しが可能になります。***

また親と子の関係や、外部キーの設定などを理解していないと、
「親モデルのデータを先に追加しないと子のデータが追加できない。」なんて
DB設計の見直しが起きる可能性も・・:fearful:

データベースを可視化できるER図はとても大切。学習メモとして残します:blossom::sunny:

##参考

(1)感動の分かりやすさ。ER図の基礎の基礎知識もあり。初心者必見 :sunrise:
[【初心者向け】丁寧すぎるRails『アソシエーション』チュートリアル【幾ら何でも】【完璧にわかる】](https://qiita.com/kazukimatsumoto/items/14bdff681ec5ddac26d1#%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%A9%9F%E8%83%BD%E3%81%A8%E3%83%84%E3%82%A4%E3%83%BC%E3%83%

元記事を表示

1ファイルでダミーのWEBサーバーを作るサンプル with Ruby/Sinatra

– 「Docker swarmを組んだから、とりあえずWEBサーバーを動かしたい」
– 「ECSでSSMからパスワードを取れているか確認したい」

そんな**とりあえず適当なWEBサーバーを動かしてみたい**ことが、時々ありますよね?

まあ、Sinatra でチョロっと書けばいいのですが、**Sinatraのドキュメントを調べたりしているうちに「チョロっと」に毎回30分ぐらいかかっている自分**に最近気づいたので、次の機会のためにコードを記事と[Githubレポジトリ](https://github.com/doloopwhile/simple-http-server)に残しておきます。

ご自由に改変してお使いください。

# コード

1ファイルにまとめている(`views/`ディレクトリを掘るのが面倒臭い!)こと、HAMLを使っていること、marx.cssを適用しているのが特長といえば特長です。

下記ファイルをコピーして実行してください。

“`
$ gem install thin sinatra sinatra-contrib haml
$ ruby app.rb

元記事を表示

OTHERカテゴリの最新記事