- 1. 【Ruby on Rails】データベースを削除する方法
- 2. Ruby on Railsを基本からまとめてみた【1】【概要と特徴】
- 3. 継続を扱えるLispの簡易的な処理系をRubyで実装
- 4. [個人開発] 普段コンビニ食品を食べているが、成分が気になる方へ向けてのサービス 「healthy-combi」を開発しました。
- 5. 【Rails】ページ毎にタイトルを変更する方法
- 6. [py2rb] assertAlmostEqual
- 7. [py2rb] 引数の省略
- 8. 【Rails】rails sができなくなった時の対処
- 9. 【Rails】コメント機能のparamsにmergeの意味を調べた
- 10. ハッシュの基礎をおさらい
- 11. rails7へのバージョンアップを安全に行うために使用するnew_framework_defaults_7_0.rbの各項目をさらっと解説
- 12. [py2rb] トップレベル変数
- 13. 【Ruby 】 ターミナルから数値出力 gets.to_iで数値変換
- 14. Railsで条件に一致する要素の個数を数え上げる時のコードのリファクタ例
- 15. 【Ruby】変数について
- 16. リセットCSS
- 17. フォーム実装について
- 18. 【Rails 6】1つのコントローラー、ビューで複数モデルに対応した汎用性高めのCSVインポート機能を作る
- 19. 最小限のテスト容易性を確保するための一提案
- 20. Ruby の IO::Buffer を使ってnon blocking に IO する
【Ruby on Rails】データベースを削除する方法
こんにちは!安田駿介です!
今回は「Railsでデータベースを削除する方法」というテーマで解説していきます。
# ターミナルで「rails db:migrate:reset」と入力する
これだけですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1903726/74424c26-09c3-a93b-1a9a-d9846f44a29b.png)
という結果になります。
#開発環境
・Cloud9
・Ruby 3.0.0
・Rails 6.1.3.1
・MySQL2
Ruby on Railsを基本からまとめてみた【1】【概要と特徴】
##Ruby on Railsとは
Ruby on Railsはプログラミング言語「Ruby」で利用される代表的なフレームワーク。
##フレームワークとは
システムを開発するために必要な機能がまとまったものをフレームワークと呼ぶ。
文字通り「枠組み」を表し、システム開発がより簡単に行えるように便利なプログラムがひとまとまりとなったシステムを指す。##Ruby on Railsの特徴
####MVCアーキテクチャー
Ruby on Railsは、MVCアーキテクチャーの基づいたフレームワークである。
データベースとのやり取りやビジネスロジックなどを担当するモデル(Model)、ブラウザへの表示を担当するビュー(View)、モデルやビューへの指令を与える役割としてのコントローラー(Controller)それぞれの頭文字を取ってMVCアーキテクチャーと呼ばれる。MVCアーキテクチャーによって、機能毎の独立性が高く、開発効率・保守性ともに高いアプリケーションを構築することが可能である。
####CoC
Convention over Configurationの略称で、日本語
継続を扱えるLispの簡易的な処理系をRubyで実装
プログラミング言語の処理系を実装してみたく思い、LispのようなS式を実行する簡易的な処理系を書いてみました。
「第一級の継続(call/cc)を実装する」というのが一番の目標でした。
ひとまずは動くものができた(と思う)ので、実装するにあたって考えたこと、試したことなどを書き残しておこうと思います。
ソースコードはこちらにあります。
https://github.com/tetetratra/mini_lisp
## 言語を軽く説明
Rubyで実装したS式の簡単な処理系です。
VM(バーチャルマシン)実行方式を採用しました。ソースコードを独自のバイトコードに変換して、それを独自のVMで実行します
扱える値は整数と文字列くらいです。組み込みの関数名などは若干Rubyに寄せています。if、while、変数などは実装してあって、こんなコードが動きます。
“`lisp
(= a 5)
(= sum 0)
(while (!= a 0)
(= sum (+ sum a))
(= a (- a 1))
)
(p sum) ; => 15
“`関数も定義できます。
[個人開発] 普段コンビニ食品を食べているが、成分が気になる方へ向けてのサービス 「healthy-combi」を開発しました。
## サービス概要
コンビニ食品をよく摂取するが、炭水化物・脂質・塩分が気になる人へ。組み合わせ食品を共有するアプリです。
URL: https://www.healthy-combi.com/
GitHub: https://github.com/takuya178/healthy-combi[![Image from Gyazo](https://i.gyazo.com/ca8957b0455b3b00f02595e053678469.jpg)](https://gyazo.com/ca8957b0455b3b00f02595e053678469)
炭水化物、脂質、塩分から控えたい成分を選び、麺類とご飯類から食べたいジャンルを選んでいただきます。
選んでいただいた条件から組み合わせ一覧が表示され、控えたい成分とカロリーの値が表示されます。## サービスを作成した背景
薬局の従業員の健康改善を目的に作成させていただきました。
そのため薬局の従業員の方達にMVPを定期的に見ていただき、サービスの修正や機能の追加を実装することができました。(本当にありがとうございました
【Rails】ページ毎にタイトルを変更する方法
##content_forを使ってタイトル名を変えていく
“content_for“というヘルパーを使って**「ログイン(ページ名) | SAMPLE BOARD APP(固定タイトル)」**と出力するやり方を見ていく。**手順**
①application_helperにヘルパーメソッドを記入
②viewにタイトルを入れていく##①application_helperにヘルパーメソッドを記入
“`application_helper.rb
module ApplicationHelper
def page_title(page_titlle = ”)
def page_title(page_title = ”)
base_title = ‘SAMPLE BOARD APP’page_title.empty? ? base_title : page_title + ‘ | ‘ + base_title
end
end
end
“`“page_t
[py2rb] assertAlmostEqual
# はじめに
移植やってます。
# assertAlmostEqual (Python)
https://docs.python.org/ja/3.7/library/unittest.html#unittest.TestCase.assertAlmostEqual概要が完成しましたので、テストを開始しています。
assertAlmostEqual
> assertNotAlmostEqual(first, second, places=7, msg=None, delta=None)
first と second が近似的に等しい (等しくない) ことをテストします。これは、places (デフォルト7) で指定した小数位で丸めた差分をゼロと比較することで行われます~~えっ、等しい場合はどうするのだろう。~~
**[追記]**
|メソッド|確認事項|
|:–:|:–:|
|assertAlmostEqual(a, b)|round(a-b, 7) == 0|# assert (Ruby)
“`ruby
assert a.round(7) == b.round
[py2rb] 引数の省略
# はじめに
移植やってます。
# 引数の省略 (Python)
“`python
def func1(str1, num1=(1, 2), num2=0):
print(num1[1] + num2)func1(‘test’, num2=5)
# 7
“`
別段変わった様子はなし。
# 引数の省略 (Ruby)
“`ruby
def func1(str1, num1=[1, 2], num2=0)
puts(num1[1] + num2)
endfunc1(‘test’, num2=5)
# 0
“`
うぅ、これに手間取りました。この時の`num1`と`num2`には、それぞれ`[1, 0]`と`0`が入っています。
よって`0`が返ってくるのは当然ですね。
しかし`5`はどこにいった?
# キーワード引数 (Ruby)
“`ruby
def func1(str1, num1: [1, 2], num2: 0)
print(num1[1] + num2)
endfunc1(‘test’, num2: 5)
“`
キーワード引数は~~`R
【Rails】rails sができなくなった時の対処
##背景
“rails s“実行中にエラーが起き、“⌘+C“で終了出来なかったため、“⌘+Z“で強制終了し、再度起動すると“`ターミナル.
=> Booting Puma
=> Rails 5.2.3 application starting in development
=> Run `rails server -h` for more startup options
A server is already running. Check /Users/ユーザー名/projects/test/tmp/pids/server.pid
Exiting
“`と上記のようなものが出た。
“/Users/ユーザー名/projects/test/tmp/pids/server.pid“はサーバー起動する際に使用しているID。本来であればサーバーを終了したら、このIDも削除されるはずだが、今回のような強制終了により、IDが残ってしまうことがある。##解決策
本来は自動で削除されるであろうこのIDを手動で消してあげれば、解決する。**手順**
①server.pi
【Rails】コメント機能のparamsにmergeの意味を調べた
コメント機能の実装する際に、comments_controllerにて以下の記述を行なった。
“`comments_controller.rb
class CommentsController < ApplicationController def create comment = current_user.comments.new(comment_params) if comment.save redirect_to board_path(comment.board),success: t('.success', item: Comment.model_name.human) else redirect_to board_path(comment.board),danger: t('.fail', item: Comment.model_name.human) end end def destroy comment = current_user.comments.find_by(id: param
ハッシュの基礎をおさらい
###rubyの知識を問題を解きながら、何が分かってて何が分かっていないかを洗い出して、復習するシリーズ
という知識を深める用アウトプットをしていくよ
ではさっそく。vol.1
##問題
“`ruby
puts hash.keys
puts hash.values
“`
というメソッドを実行した時に“`ruby
キー1st
キー2nd
キー3rd
1
2
3
“`
とターミナルに表示されるような変数hashを作成するためのコードをシンボルを使って記述する。“`ruby:回答、模範回答
hash = {キー1st:1, キー2nd:2, キー3rd:3}
“`よし、解けた。
でも、ターミナルで動かすまで{ }じゃなく[ ]で囲んでて
“`
Traceback (most recent call last):
test.rb:3:in `‘: undefined method `keys’ for [{:キー1st=>1, :キー2nd=>2, :キー3rd=>3}]:Array (NoMethodError)
“`
のエラーを出しました
rails7へのバージョンアップを安全に行うために使用するnew_framework_defaults_7_0.rbの各項目をさらっと解説
# new_framework_defaults_7_0.rbとは
railsバージョンアップの工程で、`rails app:update`コマンドを実行すると、`config/initializers/new_framework_defaults_7_0.rb`と言うファイルが作成されます。
このファイルにはrails6.1から7.0へのバージョンアップにおいて変更されるアプリケーションの設定値が書かれています。
設定値毎にコメントアウトを外していくとその箇所だけ新しい設定に変更できるので、部分的に変更を行うことが可能です。# 使い方
**1. `config/application.rb`で`config.load_defaults`を`6.1`に指定しておく**
railsのgem自体は7.0をインストールしておきますが、`config.load_defaults`を`6.1`に指定しておくことで設定は6.1の値を読み込む様にしておきます。
**2. `config/initializers/new_framework_defaults_7_0.rb`のコメントアウト
[py2rb] トップレベル変数
# はじめに
移植やってます。
# トップレベル変数 (Python)
“`other.py
a = []class A:
def __init__(self, s=None) -> None:
self.arr = list(s)a.append([A(‘mon’).arr, A(‘tue’).arr])
“`
“`main.py
import otherprint(other.a)
# [[[‘m’, ‘o’, ‘n’], [‘t’, ‘u’, ‘e’]]]
“`
トップレベルにあるローカル変数って凄いですね。
しかし、ファイル名+変数名なので、名前空間的には大丈夫そうではあります。
# ローカル変数 (Ruby)
“`other.rb
a = []class A
attr_reader :arr
def initialize(s=nil)
@arr = s.split(”)
end
enda << [A.new('mon').arr, A.new('tue').arr] ``` ```main.rb r
【Ruby 】 ターミナルから数値出力 gets.to_iで数値変換
※初心者向け
※アウトプット練習の為開発環境
rails 6.1.4.1
ruby 2.6.5#問題内容
ターミナルから数字を入力して、数字に応じて以下のように出力するプログラムを書いてください。
・0以下の数値なら0以下の数字です
・10以上の数値なら10以上の数字です
・1以上9以下の数値なら0より大きく10より小さい数字です**雛形**
“`csharp
input = gets.to_i#ここからソースコード記述。
“`
#解答
“`
input = gets.to._iif number <= 0 puts "0以下の数字です" elsif input >= 10
puts “10以上の数字です”
else
puts “0より大きく10より小さい数字です”
end
“`#解説
**①ターミナルから数値を入力する書き方**
**②条件分岐の書き方**
の2つに分けて解説します。#**①ターミナルから数値を入力する書き方**
ターミナルから数値を入力するにはgetsというメソッドを使います。このgetsメソッドを使って入力し
Railsで条件に一致する要素の個数を数え上げる時のコードのリファクタ例
railsで作られているアプリで、countを使用する機会があったので、具体例として書きました。
countを知らない人はググってみてください。“`ruby
class User
has_many :qualifications # 資格証
endclass Qualification
has_one_attached :image # 画像
end
“`
例えばこんなクラスがあったとして、あるuserが持っているqualificationsのうち、
imageが添付されているものの個数を数えたい場合を考えます。私はまず以下のように書きました。
“`ruby
attached_count = 0 # 添付されているものの個数を入れる変数
user.qualifications.each do |qualification|
attached_count += 1 if qualification.image.attached?
end
“`
このコードでも、あるuserの、imageが添付されているqualification
【Ruby】変数について
## 変数とは?
変数とは、値を入れる箱のようなものです。この箱には名前をつけることができ、どんな値が入っているのかを簡単に識別できるようになります。この名前を変数名と言います。変数を利用することで、値を再利用したい場合に、変数の名前を使うだけで呼び出すことができます。## 宣言と定義
例) number = 3
【number】 宣言→変数名をつけて変数を作ること。
【3】 定義→変数にどのような値を格納するのか記述すること。###変数の命名規則
|命名規則 |説明|
|:—————-:|:–|
|変数の中身が何かわかる|どんな名前もつけられますが、aaaのような意味のない名前は避けましょう。|
|小文字で始める|大文字からも開始できますが、とくに理由がない場合は避けましょう。|
|_(アンダーバー)で始めない|_からも開始できますが、とくに理由がない場合は避けましょう。2文字目以降には使えます。|
|数字で始めない|1文字目に使うとエラーが生じます。2文字目以降には使えます。|
|日本語を使わない|文字列以外では日本語
リセットCSS
##リセットcssとは?
各ブラウザにデフォルトで設定されているCSSを打ち消す役割をもったCSSです。###そもそも何故打ち消す必要があるのか?
各ブラウザは固有のCSSがデフォルトで指定されています。このデフォルトのCSSの影響で、自分で書いたCSSが本来意図しない表示になることがあります。よって、ブラウザがデフォルトで持っているCSSを打ち消すために、リセットCSSというCSSを使用します。**_打ち消す為に記述_**
“`qiita.rb
/* リセットCSS */
body {
font-size: 14px;
color: #333;
margin: 0 auto;
}
h1,h2,h3,h4,h5,h6,p {
padding: 10px 0;
margin: 0;
}ul,li {
padding: 0;
margin: 0;
}“`
フォーム実装について
##form要素
form要素とは、フォーム関連要素の集まりを表すブロック要素です。この“`“`のなかに、入力フォームや送信フォームを作成します。
##input要素
フォームの入力欄や実行ボタンなどを作成することができるインライン要素です。
input要素にはtype属性という設定があり、それを指定することによって様々な種類のフォーム部品を作り出すことができます。| type属性 | 用途 |
|:——–:|:—–|
| text |1行入力できる欄を作成できます。|
|checkbox |チェックボックスを複数作成できます。|
|radio |複数の選択欄から一つだけ選択できるラジオボタンを作成できます。|
|submit |送信ボタンを作成できます。|###placeholder属性
入力フォームに仮の文字列を入力できます。
例文や入力ガイドの役割があります。“`qiita.rb
< input type = "text" placeholder = "タイトル" class =
【Rails 6】1つのコントローラー、ビューで複数モデルに対応した汎用性高めのCSVインポート機能を作る
## 概要
先日、Rails でとあるサービスを作っている際に「〇〇 と △△ と □□ 〜 の CSV インポート機能を作ってくれ」といった要望を一度にたくさん受けたのですが、単にモデルの数だけ同じようなコードがダラダラと増えるのも嫌だなぁと思い何か良さげな書き方が無いか探していたところ、そこそこ汎用性の高そうなコードができたので紹介します。
![csv-importer (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/86fcfd44-822a-15fa-b0f4-60020b13577a.gif)
**主な内容**
– 1つのコントローラー、ビューで複数モデルの CSV インポートに対応
– データ挿入前にプレビュー画面を挟み、取り込み予定データの内容を確認可能
– CSVファイルの中身に問題があった場合、何行目のどこが悪いかを表示全体的に “Dry” かつコンパクトに、たとえ後に対象のモデルが増えたとしてもなるべく少量の追記で対応できるように心がけました。
##
最小限のテスト容易性を確保するための一提案
## 要約
* システムの保守性をあげるために自動テストを書くのは良いアプローチといえる
* しかし自動テストを書く時間がなかったり書くスキルがないメンバがいるという諸事情はよく発生する
* そうした時は最初(書き始め)のタイミングで、テスト対象のクラス・メソッドの処理を最後まで処理が通る1ケースだけ書こう
* このアプローチはシステムの保守性をあげるだけではなく、個人・メンバのスキルアップにも繋がることがある## テスト容易性とは
* [テスト容易性をGoogleで調べる](https://www.google.com/search?q=%E3%83%86%E3%82%B9%E3%83%88%E5%AE%B9%E6%98%93%E6%80%A7)と難しそうな話が出てきますが、本記事では **テストがしやすい** というふんわりとした言葉の意味合いで使っていきます
* テスト容易性はシステムの保守性を支える1要素ともいえ、このテスト容易性を高めることでシステムの保守性を少しでも高めることができるものです。(もちろん銀の弾丸ではありません)
* [質とスピード](https:
Ruby の IO::Buffer を使ってnon blocking に IO する
rubyの非同期タスクスケジューラー実装時に必要になったのでメモる。
See: https://ruby-doc.org/core-3.1.0/Fiber/SchedulerInterface.html 。
他のケースで必要になる場面があるのかは分かってない。
(I/Oのメソッドの中にIO::Bufferは隠蔽されていると言う認識であっているのだろうか、、、)https://ruby-doc.org/core-3.1.0/IO/Buffer.html
– IO::Bufferに保持されるバイト数は固定。(可変長ではなく、固定長を最初に確保する)
– 今まで何バイト書き込んだか(=これから何バイト目に書き込むのか)を、offset変数によって管理する。## Read from IO to IO::Buffer
“`rb
offset = 0
# 512バイトのbufferを作成
buffer = IO::Buffer.new(512)
# 読み出したいバイト数
length = 123
# 読み出し元
io = ~~~while offset < length