- 1. railsでアプリ名を確認する方法
- 2. 【Docker】Rails+MySQLの環境をDockerで構築中「ポートの衝突」に遭遇してから解決するまで
- 3. 気象×Ruby 〜Mechanizeを使ってRubyスクレイピング〜
- 4. 大学生のプログラミング学習日記
- 5. 入力された数値を素因数分解するコードをRubyでprimeライブラリを用いずに書いてみた
- 6. RSpecで可変長引数のテストがしたいとき
- 7. 【Rails】パーシャルを利用する
- 8. 【Rails】TODOアプリにバリデーションを追加する
- 9. Railsで外部キー追加時に「型の不整合」で失敗する場合の対応
- 10. Ruby小ネタ2
- 11. Rubyのtapの動きと使い方
- 12. VCRのmatch_requests_onを変更する
- 13. Rubyでboard APIを叩く
- 14. #Ruby で n個の配列の中からランダムにx個の要素を取り出す例
- 15. サ変名詞を文節で取り出す
- 16. Form_forでプルダウンメニューの項目をDBから選択する
- 17. namespace / 指定ディレクトリ以下にコントローラーを作成
- 18. undefined method ***_pathの解決策
- 19. ER図 と アソシエーションを100%理解する
- 20. 1ファイルでダミーのWEBサーバーを作るサンプル with Ruby/Sinatra
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 BeautifulSoupurl = ‘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
“