- 1. Rails modelでselfの使い方
- 2. Rubyでカイジの地下チンチロのアプリを作ってみた
- 3. 学習記録#6
- 4. 【Rails】文字列をいい感じに型変換して返す闇のメソッドを作る
- 5. rails 基本その3 投稿画面の作成
- 6. chat-spaceインクリメンタルサーチ機能の実装
- 7. #Ruby の aasm で すべてのイベントに callback で共通処理を挟んでログ出力したりするには after_all_transitions
- 8. #Ruby の AASM って何? Rails じゃなくても使えるの? 使えるよ!
- 9. Rubyの基本箇所についての復習④(ハッシュオブジェクト)
- 10. 【Ruby】minitestを使う方法
- 11. OpenAPIを利用して自前のAPIサーバー(Sinatra)を移植した時のメモ
- 12. railsのバリデーション「整数のみで文字数制限あり。なおかつ空欄でもOK」を実現する書き方
- 13. ActiveAdminで、indexのカラムにレコードの状態によって色付けをする。
- 14. 【rspec】Railsモデルテストの基本
- 15. Termux上でvimをコンパイルしたかった
- 16. Rubyのキーワード引数にto_hashを実装するオブジェクトを渡すとキーワード引数として展開される
- 17. deviseで作成したユーザー認証機能にプロフィール画像をActive Storageで追加してみる
- 18. “わからないところがわからない”方向けの勉強法
- 19. railsのArrayで範囲外のindexを指定した時にループさせる方法
- 20. Rubyで日付判定して過去日なら経過日数、未来なら何日後が表示されるアプリを作ってみた(2)
Rails modelでselfの使い方
modelでいつselfを付けるべきかがふんわりするので、まとめました。
簡単に言うと**クラスメソッドとして使いたい場合はselfを付ける、インスタンスメソッドとして使いたい場合はselfを付けない**
“`ruby
class Sample < ApplicationRecord #Sample.class_methodでこのメソッドを呼ぶ def self.class_method "class_method" end #sample = Sample.new #sample.instance_methodの形でメソッドを呼ぶ def instance_method "instance_method" end end ```
Rubyでカイジの地下チンチロのアプリを作ってみた
最近カイジを見ていて、地下チンチロをRubyで試してみようと思い作成してみた。
もう少しスマートに改修したいところ。ご意見くださると幸いです。##仕様要件
###ゲームのルールと仕様変更したところ
・親からサイコロを振る
=>仕様上、一対一になるので親制度廃止
・手番になったら3個のサイコロをふる
・サイコロを振ってどんぶりの外に出た場合はションベンという
=>仕様上、ションベンは廃止
・サイコロを振って出目がない場合は3回まで振り直しが可能
=>仕様上、親は1回のみとなっている、子は出目がない場合なので、ヒフミが出たら振り直せない
・役によってペリカのやり取り金額が変わる
=>ペリカは実装していない###役の順位
1-1-1 役物・ピンゾロ
2-2-2 役物・ゾロ目
3-3-3 役物・ゾロ目
4-4-4 役物・ゾロ目
5-5-5 役物・ゾロ目
6-6-6 役物・ゾロ目
4-5-6 役物・シゴロ
6-x-x 通常の目・6の目
5-x-x 通常の目・5の目
4-x-x 通常の目・4の目
3-x-x 通常の目・3の目
2-x-x 通常の目・2の目
1-x-x 通常の目・1の
学習記録#6
#今日やったこと
– 手慣らしタイピング:IDOLiSH7「Viva! Fantastic Life!!!!!!!」
– progate:RubyⅣ-6まで####ひとこと
文法からちょっとだけ使ってみる段階に入ってきたのでわくわく。
体調整えるためにペース落としてたけど明日からは戻せそう。##progate:RubyⅣ-6まで
○戻り値
return 値 でメソッドの呼び出し元に戻り値が返る。真偽値を返すメソッドはメソッド名?表記にするのが慣習○クラスとインスタンス
オブジェクト指向でよく聞くやつ。設計書と実体。工場みたいで楽しい。
【Rails】文字列をいい感じに型変換して返す闇のメソッドを作る
※型定義マンは発狂必至なのでそっ閉じしてください?
## 概要
訳あって、文字列の値が
数値であればIntegerもしくはFloat
trueまたはfalseであれば、Booleanに型変換して値を返すメソッドが必要になったので紹介します。Stringクラスを拡張する形で実装します??
## 準備
`/lib/core_ext`配下に下記のファイルを作成
“`ruby:/lib/core_ext/string.rb
class String
def to_suitable_type
if self.is_boolean?
self.to_boolean
elsif self.is_numeric?
self.to_numeric
else
self
end
enddef is_boolean?
self === ‘true’ || self === ‘false’
enddef to_boolean
if self === ‘true’
true
rails 基本その3 投稿画面の作成
## その10,投稿画面の作成(ルーティング)
“`ruby:routes
get ‘home/new’ => ‘home#new’
#投稿画面のルーティング
post ‘home’ => ‘home#create’
#データベースへの登録のルーティング
“`## その11, 投稿画面の作成(コントローラー)
“`ruby:controlloer
def new
end
# 投稿画面def create
テーブル名.create(カラム名: params[:カラム名(ビューのid)],他に投稿内容があれば繰り返し・・・)
end
#これでビューで入れられた内容からデータベースに入れることができる。#例
def create
Item.create(name: params[:name], image: params[:image], text: params[:text])
end“`
“`ruby:controlloer
#セキュリティーのためストロングパラメーターの設定の場合
chat-spaceインクリメンタルサーチ機能の実装
##流れ
⑴ルーティングなどAPI側の準備をする
⑵テキストフィールドを作成する
⑶テキストフィールドに入力されるたびにイベントが発火するようにする
⑷イベント時に非同期通信できるようにする
⑸非同期通信の結果を得て、HTMLを作成する
⑹作成したHTMLをビュー上に追加する
⑺エラー時の処理を行う
⑻追加ボタンが押された時にイベントが発火するようにする
⑼追加ボタンをクリックされたユーザーの名前を、チャットメンバーの部分に追加し、検索結果からは消す
⑽削除を押すと、チャットメンバーから削除される
11ログイン中のユーザーを追加済みの状態にする
12編集画面では既存のユーザーが追加済みの状態にする##⑴ルーティングなどAPI側の準備をする
routes.rbでusers#indexのルーティングを設定する。
users_controller.rbにindexアクションを追加する。
JSON形式のレスポンスを返せるようにコントローラーに設定する“`users_controllers.rb
def index
#検索した条件に当てはまるユーザーを@usersに代入
@us
#Ruby の aasm で すべてのイベントに callback で共通処理を挟んでログ出力したりするには after_all_transitions
ほぼREADMEのまま
[aasm/aasm: AASM – State machines for Ruby classes (plain Ruby, ActiveRecord, Mongoid)](https://github.com/aasm/aasm)
“`rb
require ‘aasm’class Job
include AASMaasm do
state :sleeping, initial: true
state :running, :cleaningevent :run do
transitions from: :sleeping, to: :running
endevent :clean do
transitions from: :running, to: :cleaning
endevent :sleep do
transitions from: [:running, :cleaning], to: :sleeping
end
#Ruby の AASM って何? Rails じゃなくても使えるの? 使えるよ!
それだけ。以上。
# gem
[aasm/aasm: AASM – State machines for Ruby classes (plain Ruby, ActiveRecord, Mongoid)](https://github.com/aasm/aasm)
いろいろな ORM にアダプタとして使われてるけど、どんなRuby Classでも使えるって書いてる気がするよ。
>This package contains AASM, a library for adding finite state machines to Ruby classes.
>AASM started as the acts_as_state_machine plugin but has evolved into a more generic library that no longer targets only ActiveRecord models. It currently provides adapters for many ORMs but it can be used for any Ru
Rubyの基本箇所についての復習④(ハッシュオブジェクト)
#はじめに
[前回の記事](https://qiita.com/Moon1126Snow/items/33066b3c09a873690c85)までの知識では、一つの変数に対して一つの文字か数字しか代入できません。
これでは、短い文章を表示するならともかく、複雑なアプリになってくると大量の変数を定義しなければいけなくなり、大変煩雑になってしまいます。
そこで、今回と次の記事にて、それを解消するために***ハッシュ***と***配列***というものを使えるようにしたいと思います。
#内容
ハッシュを使って、一つの変数で複数の情報を扱えるようになります。
#実行
ハッシュとは次のように書くものです。
“`ruby
sport1 = { name: “野球”, member: 9, item: “使う”}
“`
“`{}“`の中に、“`,“`で区切られて3つの情報が存在します。
どの情報にも“`:“`が含まれています。
この場合、左側“`(name,member,item)“`を***キー***といい、右側“`(“野球”,9,”○”)“`を***バリュー***と呼びま
【Ruby】minitestを使う方法
#概要
アウトプット用に、学習した内容を紹介していきます。
本日の内容はRubyにおける単体テストのためのライブラリ、minitestについてです。#環境
Mac OS Mojave 10.14.6
Ruby 2.5.3
エディタ VSCode#minitestとは
minitestとは上記の通り、単体テスト(プログラムの中で個々の機能が正しく動作しているか検証する)のためのライブラリです。
今回は’hello’という文字列を返すメソッドを持つ以下のクラスをテストしてみます。“`Ruby:Hello.rb
class Hello
def hello
return ‘hello’
end
end
“`
これに対するテストプログラムは以下のようになります。“`Ruby:TestHello.rb
require ‘minitest/autorun’
require_relative ‘Hello.rb’class TestHello < Minitest::Test def setup @hello = Hello.new end
OpenAPIを利用して自前のAPIサーバー(Sinatra)を移植した時のメモ
# はじめに
Rubyで稼動するSinatraを利用して自前のWeb APIを実装したプログラムがあります。小規模なプログラムですが必要な機能はクラス単位で分割していたのでRuby言語内であれば変更は容易に設計されています。ドキュメントを準備しようとしたタイミングで将来的にはCLIや様々な環境で実行できる小規模なクライアントが複数必要になりそうだと判断したので、OpenAPIで書き直すことにしました。
これはその際のメモです。
# OpenAPIを使おうとして学んだこと
1. OpenAPIではなくSwaggerと未だに呼ばれていて、ドキュメントの表記も安定していない
2. APIドキュメントを整備するためだけに利用する人もいる (つまり、スタブコードを生成するつもりのない人も存在する)
3. 既に存在するAPIにアクセスするクライアントを開発する目的で利用しようとする人もいる (サーバー側の説明がないものもある)
4. OpenAPI 3.0策定の過程でゴタゴタがあって[openapi-generator](https://github.com/OpenAPITools/op
railsのバリデーション「整数のみで文字数制限あり。なおかつ空欄でもOK」を実現する書き方
railsのモデルにバリデーションをかける時のTipsです。
郵便番号や電話番号、クーポンナンバーなどで、空欄でも良いけれど登録する際は「整数のみOKで文字数も制限したい!」という時があると思います。
そんな時は、次の書き方でOKです。
“`
validates :num, allow_blank: true, numericality: {only_integer: true}, length: { in: 10..11 }
“`以下が「空欄でもOK」の部分。
“`
allow_blank: true
“`以下が「整数のみ許可」の部分。
“`
numericality: {only_integer: true}
“`最後が「文字数制限」の部分です。具体的な数値は必要に応じて設定してください。
“`
length: { in: 10..11 }
“`
順序は変わっても問題ないかと思います。ちなみに、バリデーションの種類については以下の記事がとても勉強になりました。
よかったらどうぞ!
https://qiita.com/shunhikita/
ActiveAdminで、indexのカラムにレコードの状態によって色付けをする。
備忘録。
# 状況
Userというモデルがあったとして、
“`ruby
index do
column(:name)
column(:address)
column(:status)
en
“`のようなとき、特定のカラムだけ色を変えるなどでクラスをつけたい場合、
“`
column(:status, class: ‘red’)
“`とすると思う。
# だめな例
この方法では、statusによって色を変えたいなどでクラスをつけたい場合に、
“`ruby
column(:status, class: status)
“`や
“`ruby
column(:status, class: user.status)
“`のように書くことはできない。ここの時点でUserのインスタンスを取得する手段がないため、
NoMethodErrorになってしまう。では、どうするかというと、
“`ruby
column(:status) do |user|
current_arbre_element.add_class user.status
【rspec】Railsモデルテストの基本
## 概要
最近テストコードの重要性を身にしみて分かってきました。今個人的にRailsでアプリケーションを作っているのですが、deviseを使ったサインアップ機能を実現したとします。
そこで後から、Userモデルにカラムを追加したい!とか、逆にカラムを削除したい!とか、カラムをテーブルから分離させたい!なんてことがありました。
アプリケーションの基幹部分からの変更なので、モデルの構成と機能の部分で齟齬が発生しないか、やっぱり不安になっちゃうんですよね。そんな時にrspecによるテストコードをサインアップ機能と平行して書いておくと、rspecを走らせるだけで簡単に新しいDB構成の妥当性を確認することができます。
それでエラーが出るなら見直せばいいし、テストが通るならそのままでも大丈夫だと言えるはずです。
自分でまた一から操作するのはめんどくさいですからね・・:frowning2:で、今回はモデルスペックというMVCのうちmodelに対して行うテストについて書いていこうかと思います。
テストにも種類があって、優先順位や重要度なんかもあったりします。
[ごく簡単にまとめられてい
Termux上でvimをコンパイルしたかった
# お気持ちの経緯
Termuxはandroid系で動く仮想LinuxCUI環境みたいなもの、どんな中身をしているかは未だによくわからん。
「Androidでvim動かせる幸せ~」みたいな空気吸って生きてるけどtermuxで配ってるvimはluaやrubyがコンパイルされていないからふと欲しいと思ったプラグインが動かなかったりする。
そこでtermux上でvimのコンパイルをしてみたい。書きながら試しているので出来なかったらお蔵入りします。# つまり何をするのか
termux上で`vim –version | grep ruby`と叩いたときに
“`
+cscope +localmap -ruby +wildmenu
“`って表示される人のうち、`-ruby`を`+ruby`に直したい人。
# vimのソースコードをインストール
まずはここから。
`svn`とか`wget`とかでソースコードをインストールできるがこの場合vimのバージョンを指定しないといけない。そういうのはめんどくさい。
`git`
Rubyのキーワード引数にto_hashを実装するオブジェクトを渡すとキーワード引数として展開される
## TL;DR
Rubyにおいて、キーワード引数を取るメソッドには、`to_hash`メソッドを実装しているオブジェクトを渡すことができて、キーワード引数として展開して解釈される。
## キーワード引数とは
“`ruby
def log(msg, level: “ERROR”, time: Time.now)
puts “#{ time.ctime } [#{ level }] #{ msg }”
endlog(“Hello!”, level: “INFO”) #=> Mon Feb 18 01:46:22 2013 [INFO] Hello!
“`(https://magazine.rubyist.net/articles/0041/0041-200Special-kwarg.html より引用)
この`log`メソッドの`level`や`time`みたいな感じで、引数にデフォルト値を指定することができて、また名前を指定して引数を渡せるという便利機能です。
## Hashはキーワード引数に展開される
キーワード引数にはHashを渡すことができて、その場
deviseで作成したユーザー認証機能にプロフィール画像をActive Storageで追加してみる
# はじめに
deviseで導入したユーザー認証機能にユーザーのプロフィール画像を追加したかったので、はじめはcarrierwaveなどを使って画像をアップロードしようと考えていたがRails 5.2から導入されたActive Storageを使えば、Usersテーブルに画像用のカラムを追加することなくプロフィール画像を設定できるようなので使ってみました。deviseは導入済みという前提で進めていきます。
## 環境
ruby 2.6.5
rails 5.2.3## Active Storageを準備する
“`bash
$ rails active_strage:install$ rails db:migrate
“`このコマンドの実行で2つのテーブルが作成されます。
– active_storage_blobs
– active_storage_attachments### active_storage_blobs
ファイル名やファイルの種類、バイト数とかを保持するテーブルみたいです。### active_storage_attachme
“わからないところがわからない”方向けの勉強法
#目次
– 目的
– 必要なもの
– 学習法
– まとめ##目的
プログラミングの学習をしていると、ひたすらカタカナや英語が登場し、「わからないところがわからない・・・」と悩む方が多いです。
これはハードウェアの領域なのか?
ネットワークが原因なのか?
PCの知識が必要なのか、まずは英語の勉強をすべきなのか。。。どこから手を付けたらいいかわからない、そんな方への勉強方法を紹介します。
##必要なもの
マインドマップここではGoogleアカウントをお持ちの方向けへ、[“MindMup”](https://www.mindmup.com/#storage) を紹介します。
GoogleDriveにMindMupを追加します。
[![Image from Gyazo](https://i.gyazo.com/383e515607f7f9e6f83060e5e61db2ec.png)](https://gyazo.com/383e515607f7f9e6f83060e5e61db2ec)
右下のアプリを追加→MindMupと検索し、追加。※A4用紙などでも構いません。
#
railsのArrayで範囲外のindexを指定した時にループさせる方法
通常、Arrayクラスのオブジェクトで範囲外のindexを指定するとnilが返ります。
“`bash
> message_array = [‘success’, ‘warning’, ‘info’, ‘danger’]
> message_array[4]
=> nil
“`しかし
範囲外のindexを指定した際、良しなにindexをループさせて欲しい場面があったので、紹介します。
(上記の例だとmessage_array[4]を指定した時に`success`を返して欲しい)## 動作環境
rails 5.2.2.1## 準備
### Arrayクラスを拡張する
lib/core_extにArrayクラス拡張用のファイルを作成します。“`ruby:/lib/core_ext/array.rb
class Array
def values_at_loop(index)
self[index % length]
end
end
“`initializerで上記ファイルをrequireします。
“`ruby:/config/init
Rubyで日付判定して過去日なら経過日数、未来なら何日後が表示されるアプリを作ってみた(2)
改修してみました。
##仕様要件
・入力した日付の正当性をチェックをする
・過去日なら経過日数を表示する
・未来日なら何日後なのか表示させる・未入力はNG、必ず入力させる
##実際に書いてみた
“`ruby:day_count.rb
require “date”# 整数を3桁ごとにカンマ表記にする
def int_comma(i)
i.to_s.gsub(/(?<=\d)(?=\d{3}+$)/, ',') end # 今日の日付取得、表示 today = Date.today weekend = %w(日 月 火 水 木 金 土) puts "本日は、#{today.strftime("%Y/%-m/%-d")}(#{weekend[today.wday]})です" input_year = nil puts "\n指定日時を設定します" # 指定年を入力 loop_flg = 0 while loop_flg == 0 do puts "\n指定年を4桁の整数で入れてください。小数を入力した場合は整数部分のみ認識されます" # 入力文字列を変数に代