- 投稿日:2020-11-27T23:21:26+09:00
Rails RSpec による画像添付結合テスト
はじめに
RSpecによるオリジナルアプリの結合テストを行っています。画像投稿機能において、「テスト用の画像を添付する」、「添付したテスト用の画像が画面上にあるか」の2つを忘れていたので、備忘録として書き記します。
#目次
1.テスト用の画像を添付する
2.添付したテスト用の画像が画面上にあるかテストする1.テスト用の画像を添付する
ここではimage_pathという変数にテスト用画像(test_image.jpg)を添付する。この時相対パスで指定する。
attach_fileメソッドはアップロードのinput要素にテスト用画像を添付することができる。第一引数にアップロードするinput要素のname属性の値、第二引数にアップロードする画像のパス、第三引数にオプション(ここではmake_visible: trueで一時的に表示)を設定する。spec/system/◯◯_spec.rb# 添付する画像を定義する image_path = Rails.root.join('public/images/test_image.jpg') # 画像選択フォームに画像を添付する attach_file('desk[image]', image_path, make_visible: true)2.添付したテスト用の画像が画面上にあるかテストする
画像を投稿すると、画像一覧ページに遷移する。遷移先で投稿した画像があるかの確認は下記コードに記す。have_selectorで要素があるか判断する。ちなみにhave_content()で文字列があるかのマッチャになる。
spec/system/◯◯_spec.rbexpect(page).to have_selector("img[src$='test_image.jpg']")以上
- 投稿日:2020-11-27T21:41:56+09:00
【Rails】Ajaxでいいねの数を表示する方法
概要
前回の続きでいいねカウントの実装をしていいねの数を表示していきたいと思います。
APIの作成
まずJavaScriptからリクエストが来たときに返したいデータを定義していきます。
JavaScriptでリクエストを送ったら現在のいいね数をresponseで返すことができれば、実装できると思いました。いいねの数を取得するために、
LikesControllerのshowアクション内でlike_countを定義
しました。app/controllers/likes_controller.rbdef show like_count = @team.likes.count render json: { likeCount: like_count } endただ、私が実装したいことは
現在のいいね数を
DOMContentLoaded
イベント時に取得することだけでなく、POSTとDELETEのリクエストの時にも取得したいと考えています。
そのため、showアクション内にだけ定義するのではなくcreate
,destroy
にも定義していく必要があります。create
とdestroy
でもrender json
にlikeCount
を入れないとJavaScriptからのリクエストに対応するデータがないのでundefinedになって返ってきてしまいます。前回と重複するところもありますが、
LikesController
の記述はこのようになると思いました。before_action :like_counts
でアクションの最初に読み込むようにしています。LikesController
app/controllers/likes_controller.rbclass LikesController < ApplicationController before_action :authenticate_user! before_action :set_like before_action :like_counts def show like_status = current_user.has_liked?(@team) render json: { hasLiked: like_status, likeCount: like_counts }.to_json end def create @team.likes.create!(user_id: current_user.id) render json: { status: 'ok', likeCount: like_counts }.to_json end def destroy like = @team.likes.find_by!(user_id: current_user.id) like.destroy! render json: { status: 'ok', likeCount: like_counts }.to_json end private def set_like @team = Team.find(params[:team_id]) end def like_counts @like_count = @team.likes.count end endどこにいいねの数を表示するのか
show.html.haml.star_counter 現在 %span がいいねをしています。今回、star_counterクラス内のspanタグ内にいいねの数を入れていこうかと思います。
span
を入れた理由はいいねの数をscss
でスタイルを調整しようと考えているからです。たとえば、以下のようにすればいいねの数だけ文字が赤く太くなります。SCSS
scss.star_counter { span { color: red; // 好きな色 font-weight: bold; // 線を太くして強調 } }いいねの数を取得(GET)
JavaScriptで実装したいこととしてはまず、GETリクエストで現在のいいねの数を取得することです。
そのため、GETリクエストが成功したらいいねの数を表示させていきます。コードにするとこのようになると思いました。 ※前回と重複するところは省略しております。
jQuery// GET, POST, DELETEリクエストで使うので処理をまとめています。 const likeCountCalculation = (likeCount) => { // いいねの数を表示させたいところを取得。今回はstar_counterクラス内のspan要素を取得しています。その後appendで追加していくという処理です。 $('.star_counter > span').append( `${likeCount}人` ) } // axiosでGETリクエスト成功 .then((response) => { // response内に先程Controllerで書いたlikeCountがjson形式で返されるので取得。 const likeCount = response.data.likeCount // 上で定義してあるlikeCountCalculation()が呼び出されて、span要素内に現在のいいねの数が表示されるようになります。現在のいいねの数はlikeCountに入っているので関数を呼び出すときにを引数にいれています。 likeCountCalculation(likeCount) })いいねの数の増減 (POST, DELETE)
はじめは、
likeのcountを+1, -1
することで実装すればと思っていたのですが、それよりもGETの処理と同じ考え方で現在のいいねの数を取得すれば良いのでは?と考えました。現在のというのは+1や-1されたあとのいいねの数のことです。要するに、POSTやDELETEリクエストが成功すればいいねの数は増減しているのでその値を取得することで実装できると思いました。
コードにするとこのようになると思います。POSTもDELETEも同じ記述なのでまとめて書かせていただきます。GETの処理と違う点は、リクエストが成功したらspan要素の中身を空にするということです。これをしないとリクエストの度に要素が追加されていってしまいます。jQuery// axiosでリクエスト(POST or DELETE)成功 .then((response) => { // responseに入ってくるいいねの数を取得 const likeCount = response.data.likeCount // star_counterクラス内のspan要素の中身を空にする。 $('.star_counter > span').html('') // 現在いいねの数を表示する。 likeCountCalculation(likeCount) })まとめ
- 前回同様やりかたは一つではないこと。
- 親要素内の子要素を取得する方法もひとつではなく選択肢がたくさんあり、わかりやすいものを使う。(読みやすいコードだったり状況に応じて判断)
- jsonで複数の値を返すには記述を変える必要がある。
最後に
自分の実装したいことをどうやって実現していくのか、ここの言語化が大事だと感じました。実装したいことに対して、いくつもの方法があるということは、簡単に書けるものだったり逆に複雑になってしまったりすることがあると思います。こういったところもたくさんコードを書いたり技術書を読んだり、記事を見たりして学習していくことで力をつけていきます。
参考文献
- length、size、count メソッドの違いまとめ【Ruby】
- Ruby 2.7.0 リファレンスマニュアル
- 【Rails】JSON形式のデータを返却する方法とは?
- jQueryで子要素を取得するいくつかの方法〜children,find,contents
- jQuery で innerHTML の書き換え/取得/追記/削除を行う方法
前回書いた記事です。いいねの実装をこちらでしているのでよろしければご覧ください!
- 投稿日:2020-11-27T21:03:19+09:00
Python学習 基礎編 ~数値と計算~
こちらではPython学習の備忘録と、Ruby、JavaScriptとの比較も含め記載していきたいと思います。
プログラミング初心者や他の言語にも興味、関心をお持ちの方の参考になれば幸いです。数値とは?
プログラミングでは、数値を扱うこともでき、文字列とは違いクォーテーションで囲む必要がない。
クォーテーションをつけると、文字列と解釈されるため、文字列と数値は明確に違うものであることを意識しよう。計算について
数値は、足し算「+」、引き算「-」、掛け算「*」(アスタリスク)、割り算「/」(スラッシュ)、余剰(割り算の余り)「%」の計算が可能です。
また数値や記号はすべて半角で記述する。※記号の前後の半角スペースはなくても構わないですが、入れた方がコードが見やすいと思います。
以上は、Python、Ruby、JavaScriptで共通となります。
各言語の記述を下記に記載します。Python
script.pyprint(3) # 数値のみ print(3 + 5) # 対し算 print(6 - 5) # 引き算 print(3 * 5) # 掛け算 print(20 / 5) # 割り算 print(8 % 5) # 余剰(割り算の余り) # コンソール 3 8 1 15 4 3 # 8割る5は、1余り3Ruby
index.rbputs 3 puts 3 + 5 puts 6 - 5 puts 3 * 5 puts 20 / 5 puts 8 % 5JavaScript
script.jsconsole.log(3); console.log(3 + 5); console.log(6 - 5); console.log(3 * 5); console.log(20 / 5); console.log(8 % 5);
おわりに
数値に関しては、各言語ともに共通する部分が多いので覚えやすいですね。次回は文字列の連結などをやろうかな...では!
- 投稿日:2020-11-27T20:28:43+09:00
Ruby on Railsでdeviseとscaffoldを組み合わせた際に調べたことをまとめてみた。
はじめに
Ruby on Railsでdeviseとscaffoldを使って簡易アプリを作っているときに分からないコードなど、調べたことを自分用にまとめてみました。
環境
MacOS Catalina version 10.15.7
Rails 6.0.3.4
devise 4.7.3
前提
$ rails new アプリ名
でアプリができている状態
deviseの導入
以下のurlのページを参考にdeviseでログイン機能等を作成する。
rails g devise:install
でファイルの作成を終えた後、下のコードを記述する。config/environments/development.rbconfig.action_mailer.default_url_options = { host: 'localhost', port: 3000 }こちらのページ⇨ https://qiita.com/Orangina1050/items/a16e655519a60f35b394
scaffoldの導入
既に作ってあるアプリにディレクトリを移動した後、以下の形式でscaffoldを実行する。
$ rails g scaffold モデル名 カラム1:データ型1 カラム2:データ型2
自分は自己紹介をする簡易アプリなので以下のカラムを持たせた。
$ rails g scaffold intro name:string hometown:string text:contentscaffold実行後以下を行う。
$ rails db:migrateカラムをつけ忘れて追加したい場合
rails g migration 行なう処理Toテーブル名 カラム名:データ型
の形式で実行する。カラムを加えるなら、AddColumnToテーブル名
というように書く。自分は、user_idのカラムをつけ忘れたため、
$ rails g migration AddColumnToIntros user_id:integerを行った。
rails db:migrate
も忘れずに。コントローラーに設定を加える
scaffoldによってできたコントローラー(intros_controller.rb)の一番上に、
before_action :authenticate_user!
を記入する。before_action :authenticate_user!とは
authenticate_user!はdeviseを入れる事で使えるようになるヘルパーの一つで、
コントローラーに設定してログイン済ユーザーのみにアクセスを許可する。
参考 https://qiita.com/ryuuuuuuuuuu/items/bf7e2ea18ef29254b3dd
次に、newアクション内に下記を追加する。
app/controllers/intros_controller.rb@intro = Intro.find_or_create_by(:user_id => current_user.id)find_or_create_byとは
は引数の条件に該当するデータがあればそれを返し
find_by(attributes)
、なければ新規作成create(attributes, &block)
します。今回は、user_idがcurrent_user.idの場合、それを取得、なければ作成を行っている。
参考 https://qiita.com/taimuzu/items/0a21738d018f475d63ae自己紹介を既に作成しているユーザーが新規作成のボタンを押したときに編集ページにとんでほしいのでnewアクションに
app/controllers/intros_controller.rbredirect_to edit_intro_url(@intro)を追記する。これは
redirect_to edit_intro_url(@user.id)
と同じことをやっている。
参考 https://qiita.com/Kawanji01/items/96fff507ed2f75403ecbredirect_toのパス確認
さっき指定したリダイレクト先は、以下のコマンドを打つと様々なパスが出てくるので、そこから対象のものを探す。
edit_intro_url
の部分。$ rails routes最後に、editアクションにidがcurrent_user.idかそうでないか分岐する処理を書く。
app/controllers/intros_controller.rbif @intro.user_id != current_user.id flash[:notice] = "他のユーザーの編集はできません。" redirect_to intros_path endその際に、もとからindex.html.erbとshow.html.erbに書かれている、
<p id="notice"><%= notice %></p>
をコメントアウトすることで、flash[:notice]の内容を表示することができる。
- 投稿日:2020-11-27T20:28:43+09:00
Ruby on Railsでdeviseとscaffoldを組み合わせた際に調べたところをまとめてみた。
はじめに
Ruby on Railsでdeviseとscaffoldを使って簡易アプリを作っているときに分からないコードなど、調べたことを自分用にまとめてみました。
環境
MacOS Catalina version 10.15.7
Rails 6.0.3.4
devise 4.7.3
前提
$ rails new アプリ名
でアプリができている状態
deviseの導入
以下のurlのページを参考にdeviseでログイン機能等を作成する。
rails g devise:install
でファイルの作成を終えた後、下のコードを記述する。config/environments/development.rbconfig.action_mailer.default_url_options = { host: 'localhost', port: 3000 }こちらのページ⇨ https://qiita.com/Orangina1050/items/a16e655519a60f35b394
scaffoldの導入
既に作ってあるアプリにディレクトリを移動した後、以下の形式でscaffoldを実行する。
$ rails g scaffold モデル名 カラム1:データ型1 カラム2:データ型2
自分は自己紹介をする簡易アプリなので以下のカラムを持たせた。
$ rails g scaffold intro name:string hometown:string text:contentscaffold実行後以下を行う。
$ rails db:migrateカラムをつけ忘れて追加したい場合
rails g migration 行なう処理Toテーブル名 カラム名:データ型
の形式で実行する。カラムを加えるなら、AddColumnToテーブル名
というように書く。自分は、user_idのカラムをつけ忘れたため、
$ rails g migration AddColumnToIntros user_id:integerを行った。
rails db:migrate
も忘れずに。コントローラーに設定を加える
scaffoldによってできたコントローラー(intros_controller.rb)の一番上に、
before_action :authenticate_user!
を記入する。before_action :authenticate_user!とは
authenticate_user!はdeviseを入れる事で使えるようになるヘルパーの一つで、
コントローラーに設定してログイン済ユーザーのみにアクセスを許可する。
参考 https://qiita.com/ryuuuuuuuuuu/items/bf7e2ea18ef29254b3dd
次に、newアクション内に下記を追加する。
app/controllers/intros_controller.rb@intro = Intro.find_or_create_by(:user_id => current_user.id)find_or_create_byとは
は引数の条件に該当するデータがあればそれを返し
find_by(attributes)
、なければ新規作成create(attributes, &block)
します。今回は、user_idがcurrent_user.idの場合、それを取得、なければ作成を行っている。
参考 https://qiita.com/taimuzu/items/0a21738d018f475d63ae自己紹介を既に作成しているユーザーが新規作成のボタンを押したときに編集ページにとんでほしいのでnewアクションに
app/controllers/intros_controller.rbredirect_to edit_intro_url(@intro)を追記する。これは
redirect_to edit_intro_url(@user.id)
と同じことをやっている。
参考 https://qiita.com/Kawanji01/items/96fff507ed2f75403ecbredirect_toのパス確認
さっき指定したリダイレクト先は、以下のコマンドを打つと様々なパスが出てくるので、そこから対象のものを探す。
edit_intro_url
の部分。$ rails routes最後に、editアクションにidがcurrent_user.idかそうでないか分岐する処理を書く。
app/controllers/intros_controller.rbif @intro.user_id != current_user.id flash[:notice] = "他のユーザーの編集はできません。" redirect_to intros_path endその際に、もとからindex.html.erbとshow.html.erbに書かれている、
<p id="notice"><%= notice %></p>
をコメントアウトすることで、flash[:notice]の内容を表示することができる。
- 投稿日:2020-11-27T18:46:25+09:00
README.org
第9回 <2020-11-18 水>
assert_equal
- LINK -> 第9回
第8回 <2020-11-11 水>
条件分岐
- LINK -> 第8回
第7回 <2020-11-04 水>
条件分岐
- LINK -> 第7回
第6回 <2020-10-28 水>
変数とかメソッドとか
- LINK -> 第6回
第5回 <2020-10-21 水>
第1回目から第4回目までは環境構築だったり、gitだったりでした。今回の第5回からようやく本格スタート
README_links <2020-10-14 水>
equation <2020-10-28 水>
$$\frac{1}{4}$$
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/README.org
- 投稿日:2020-11-27T18:37:44+09:00
第8回
Rake
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
自動化
rake とは?
make とかのRuby版。Rakefile の記述に沿って、自動で処理を行ってくれる。うん、単純。講義で扱った例を見てみる。
task :default do system 'rake -T' exit end desc 'hello NAME' task :hello do name = ARGV[1] puts "Hello #{name}!" exit end意味解説
上記例を読み解いていく。まず、これの実行は
$ rakeすると、このような出力を得る。
rake hello # hello NAMEこれは、引数なしで実行した時の動作(default)が
rake -T
を実行するようにRakefileで記述されているからである。rake -T
はRakefileに記述されているタスク一覧を表示するコマンドである。詳しい記述法は以下である。
- descの後にはrake -Tとした時の説明文(description)
- :defaultはrakeが引数なしで呼ばれた時の動作
- それ以外はoptionで呼ばれるtaskの名前
- taskの中には標準のruby言語で,動作を記述
いざ、実践!
desc 'git push' task :push do ["git pull origin main", "git add -A", "git commit -m \'hoge\'", "git pull origin main", "git push origin main"].each do |comm| puts comm.green system comm end exit endかなり罪深い。gitの一連の流れを自動化してしまった。コミットのコメントなんて、毎回同じやし。まぁいいか。本番環境ではダメ、ゼッタイ。いや、こうしよう。
desc 'git push' task :push do com = ARGV[1] ["git pull origin main", "git add -A", "git commit -m \'"+com+"\'", "git pull origin main", "git push origin main"].each do |comm| puts comm.green system comm end exit endこれによって、
rake push "mod"としたらコミットメッセージも変更できる。便利。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no8.org
- 投稿日:2020-11-27T18:37:44+09:00
第8回、Rakeで作業自動化
Rake
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
自動化
rake とは?
make とかのRuby版。Rakefile の記述に沿って、自動で処理を行ってくれる。うん、単純。講義で扱った例を見てみる。
task :default do system 'rake -T' exit end desc 'hello NAME' task :hello do name = ARGV[1] puts "Hello #{name}!" exit end意味解説
上記例を読み解いていく。まず、これの実行は
$ rakeすると、このような出力を得る。
rake hello # hello NAMEこれは、引数なしで実行した時の動作(default)が
rake -T
を実行するようにRakefileで記述されているからである。rake -T
はRakefileに記述されているタスク一覧を表示するコマンドである。詳しい記述法は以下である。
- descの後にはrake -Tとした時の説明文(description)
- :defaultはrakeが引数なしで呼ばれた時の動作
- それ以外はoptionで呼ばれるtaskの名前
- taskの中には標準のruby言語で,動作を記述
いざ、実践!
desc 'git push' task :push do ["git pull origin main", "git add -A", "git commit -m \'hoge\'", "git pull origin main", "git push origin main"].each do |comm| puts comm.green system comm end exit endかなり罪深い。gitの一連の流れを自動化してしまった。コミットのコメントなんて、毎回同じやし。まぁいいか。本番環境ではダメ、ゼッタイ。いや、こうしよう。
desc 'git push' task :push do com = ARGV[1] ["git pull origin main", "git add -A", "git commit -m \'"+com+"\'", "git pull origin main", "git push origin main"].each do |comm| puts comm.green system comm end exit endこれによって、
rake push "mod"としたらコミットメッセージも変更できる。便利。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no8.org
- 投稿日:2020-11-27T18:37:41+09:00
第7回
条件分岐
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
if-elsif-else-end
お題
閏年の判定。テストする年は
2004, 1999, 1900, 2000
この4つで。Ruby での条件分岐
Ruby のリファレンシャルマニュアルにはこう書かれている。
if 式 [then] 式 ... [elsif 式 [then] 式 ... ] ... [else 式 ... ] end[]は省略可能を意味する。注意すべきは
else if
でなくelif
でもなくelsif
であることくらいで、そんなに目新しいことはない。then
も省略できるし簡単そう。けど上のマニュアルの記述はわかりずらいので例を出していく.類題を解く
- 2004年は?
A. 閏年である。4で割り切れるから。その条件分岐を書くには?
p year = ARGV[0].to_i if year % 4 == 0 p true end上のコードは実行時に引数を受け取って実行すると、引数をIntegerに変換して4で割った余りが0かどうかを判断して、そうであれば
true
を返す。
- 1999 はfalse
p year = ARGV[0].to_i if year % 4 == 0 p true else p false end簡単!
- 1900年は?
A. Not 閏年。100で割り切れるから。
p year = ARGV[0].to_i if year % 100 == 0 p false elsif year % 4 == 0 p true else p false end
- 2000年は?
A. 閏年。400で割り切れるから。
p year = ARGV[0].to_i if yeay % 400 == 0 p true elsif year % 100 == 0 p false elsif year % 4 == 0 p true else p false endテストするのに引数だと面倒臭い
配列に年を入れてループで回す。
[1900,2004,1999,2000].each do |year| p year if yeay % 400 == 0 p true elsif year % 100 == 0 p false elsif year % 4 == 0 p true else p false end endメソッド化しよう
def leap?(year) if yeay % 400 == 0 p true elsif year % 100 == 0 p false elsif year % 4 == 0 p true else p false end end [1900,2004,1999,2000].each do |year| p year leap?(year) endぽいことになってきたー。
case
case を使うと綺麗になる?
さっきも出てきた、リファレンシャルマニュアルをみると、こう書かれている。
case [式] [when 式 [, 式] ...[, `*' 式] [then] 式..].. [when `*' 式 [then] 式..].. [else 式..] endこれはわかりずらい。マニュアルにある例を借りてくるとわかりやすい。
case age when 0 .. 2 "baby" when 3 .. 6 "little child" when 7 .. 12 "child" when 13 .. 18 "youth" else "adult" endこれを使ってさっきの閏年の判定を綺麗にしよう。
def leap?(year) return case when year % 400 ==0 true when year % 100 ==0 false when year % 4 ==0 true else false end end [1900,2004,1999,2000].each do |year| p year leap?(year) end実行結果の確認。
$ ruby leap_year.rb 1900 false 2004 true 1999 false 2000 trueおおーいい感じ。以上。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no7.org
- 投稿日:2020-11-27T18:37:41+09:00
第7回、Rubyの条件分岐
条件分岐
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
if-elsif-else-end
お題
閏年の判定。テストする年は
2004, 1999, 1900, 2000
この4つで。Ruby での条件分岐
Ruby のリファレンシャルマニュアルにはこう書かれている。
if 式 [then] 式 ... [elsif 式 [then] 式 ... ] ... [else 式 ... ] end[]は省略可能を意味する。注意すべきは
else if
でなくelif
でもなくelsif
であることくらいで、そんなに目新しいことはない。then
も省略できるし簡単そう。けど上のマニュアルの記述はわかりずらいので例を出していく.類題を解く
- 2004年は?
A. 閏年である。4で割り切れるから。その条件分岐を書くには?
p year = ARGV[0].to_i if year % 4 == 0 p true end上のコードは実行時に引数を受け取って実行すると、引数をIntegerに変換して4で割った余りが0かどうかを判断して、そうであれば
true
を返す。
- 1999 はfalse
p year = ARGV[0].to_i if year % 4 == 0 p true else p false end簡単!
- 1900年は?
A. Not 閏年。100で割り切れるから。
p year = ARGV[0].to_i if year % 100 == 0 p false elsif year % 4 == 0 p true else p false end
- 2000年は?
A. 閏年。400で割り切れるから。
p year = ARGV[0].to_i if yeay % 400 == 0 p true elsif year % 100 == 0 p false elsif year % 4 == 0 p true else p false endテストするのに引数だと面倒臭い
配列に年を入れてループで回す。
[1900,2004,1999,2000].each do |year| p year if yeay % 400 == 0 p true elsif year % 100 == 0 p false elsif year % 4 == 0 p true else p false end endメソッド化しよう
def leap?(year) if yeay % 400 == 0 p true elsif year % 100 == 0 p false elsif year % 4 == 0 p true else p false end end [1900,2004,1999,2000].each do |year| p year leap?(year) endぽいことになってきたー。
case
case を使うと綺麗になる?
さっきも出てきた、リファレンシャルマニュアルをみると、こう書かれている。
case [式] [when 式 [, 式] ...[, `*' 式] [then] 式..].. [when `*' 式 [then] 式..].. [else 式..] endこれはわかりずらい。マニュアルにある例を借りてくるとわかりやすい。
case age when 0 .. 2 "baby" when 3 .. 6 "little child" when 7 .. 12 "child" when 13 .. 18 "youth" else "adult" endこれを使ってさっきの閏年の判定を綺麗にしよう。
def leap?(year) return case when year % 400 ==0 true when year % 100 ==0 false when year % 4 ==0 true else false end end [1900,2004,1999,2000].each do |year| p year leap?(year) end実行結果の確認。
$ ruby leap_year.rb 1900 false 2004 true 1999 false 2000 trueおおーいい感じ。以上。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no7.org
- 投稿日:2020-11-27T18:37:39+09:00
第6回
変数とメソッド
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
変数(variable)
お題
受け取った引数ARGV[0]をnameという変数に代入してそれを出力する
RudyRuby での変数
ruby には型宣言の必要がなく、いい感じに型を決めてくれる。代入はいつものようにできる。
name = 'Rudy'類題を解く
- name に代入して Ruby と出力
name = 'Ruby' puts "hello #{name}."
- ARGV[0] を受け取って, 自分の名前を返す。
name = ARGV[0] puts "hello #{name}."メソッド(method)
お題
$ ruby hello\_method.rb RudyHell Rudy.となる hello method を作る。
Ruby のmethod
Ruby での関数は method を定義する。method は 0 個以上の引数を受け取ることができる。例として、以下。
def hello(name) p name end類題を解く
def hello(name) p "hello #{name}" end name = ARGV[0] hello(name)おまけ
最終はこうした。
def hello(name) puts "hello #{name}" end def gets_name name = ARGV[0] if name == nil puts "What\'s your name? " name = gets.chomp end return name end hello gets_name
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no6.org
- 投稿日:2020-11-27T18:37:39+09:00
第6回、Rubyの変数とメソッド
変数とメソッド
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
変数(variable)
お題
受け取った引数ARGV[0]をnameという変数に代入してそれを出力する
RudyRuby での変数
ruby には型宣言の必要がなく、いい感じに型を決めてくれる。代入はいつものようにできる。
name = 'Rudy'類題を解く
- name に代入して Ruby と出力
name = 'Ruby' puts "hello #{name}."
- ARGV[0] を受け取って, 自分の名前を返す。
name = ARGV[0] puts "hello #{name}."メソッド(method)
お題
$ ruby hello\_method.rb RudyHell Rudy.となる hello method を作る。
Ruby のmethod
Ruby での関数は method を定義する。method は 0 個以上の引数を受け取ることができる。例として、以下。
def hello(name) p name end類題を解く
def hello(name) p "hello #{name}" end name = ARGV[0] hello(name)おまけ
最終はこうした。
def hello(name) puts "hello #{name}" end def gets_name name = ARGV[0] if name == nil puts "What\'s your name? " name = gets.chomp end return name end hello gets_name
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no6.org
- 投稿日:2020-11-27T18:37:37+09:00
第5回
Ruby で標準出力
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
puts hello_world
お題
Hello world.これを出力してみる
Ruby の文字出力
method 使いどき 基本はこれ、改行はセルフ puts まぁ普通に使う、改行は自動 p これは debug で使うらしい。 pp pのpretty print で,require 'pp' が必要らしい。 printf C のこれも使える。formatを指定できるから便利な時もある。 やってみよ
- puts
puts 'hello world'をファイル
puts_hello_world.rb
に記述して$ ruby puts_hello_world.rbでた。
hello world類題
- pとかprintとか
# coding: utf-8 # start here for print, p and pp # print は改行なしで文字列が出力される。 print 'hello world' # p は改行込みで出力されるが、文字列はダブルクォーテーションで囲まれる p 'hello world' ## pp も p と見かけは同じである。 pp 'hello world'gets もあるけど今回はARGV[0]
お題
$ ruby hello_name.rb Rudyこのコマンドに対して
Hello Rudy.と出力されるようにする。
Ruby の文字入力
まぁ順当にいけばputsしたしgetsだけど、この講義はCLIの引数から拾ってくる。ファイル
hello_name.rb
に以下を記述してputs ARGV[0]からのコマンド
$ ruby hello_name.rb Rudy出る。
Rubyこの辺はまぁ普通かな。
Hello Rudy.
とさせるのはいろんな方法があって、
puts puts "Hello " + ARGV[0] puts puts "Hello #{ARGV[0]}" print "Hello #{ARGV[0]}\n" print "Hello " + ARGV[0] + "\n" だそうです。
やってみよ
これを用いてさっきの
hello_name.rb
を書き換える。puts "hello #{ARGV[0]}."それから
$ ruby hello_name.rb Rudy出る。
hello Ruby.リダイレクト(redirect)
標準出力をファイルに書き込む
Bash等にはファイルディスクリプタを変更する機能が備わっている。まぁゆうたら標準出力をターミナル画面に表示するんじゃなくてファイルに書き込める。
# ruby hello_name.rb bob > hello_name.txtってやったら、~hello_name.txt~ に出力結果が出力される(追記じゃなくて上書き)
# cat hello_name.txtをしてみると中身を見れる。
hello bob.ちなみにファイル最後尾に追記したいときは
# ruby hello_name.rb bob >> hello_name.txtみたいに
>>
ってする。両方とも、ファイルが無かったら新規に作成してくれる。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no5_1.org
- 投稿日:2020-11-27T18:37:37+09:00
第5回、Rubyに触れる
Ruby で標準出力
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
puts hello_world
お題
Hello world.これを出力してみる
Ruby の文字出力
method 使いどき 基本はこれ、改行はセルフ puts まぁ普通に使う、改行は自動 p これは debug で使うらしい。 pp pのpretty print で,require 'pp' が必要らしい。 printf C のこれも使える。formatを指定できるから便利な時もある。 やってみよ
- puts
puts 'hello world'をファイル
puts_hello_world.rb
に記述して$ ruby puts_hello_world.rbでた。
hello world類題
- pとかprintとか
# coding: utf-8 # start here for print, p and pp # print は改行なしで文字列が出力される。 print 'hello world' # p は改行込みで出力されるが、文字列はダブルクォーテーションで囲まれる p 'hello world' ## pp も p と見かけは同じである。 pp 'hello world'gets もあるけど今回はARGV[0]
お題
$ ruby hello_name.rb Rudyこのコマンドに対して
Hello Rudy.と出力されるようにする。
Ruby の文字入力
まぁ順当にいけばputsしたしgetsだけど、この講義はCLIの引数から拾ってくる。ファイル
hello_name.rb
に以下を記述してputs ARGV[0]からのコマンド
$ ruby hello_name.rb Rudy出る。
Rubyこの辺はまぁ普通かな。
Hello Rudy.
とさせるのはいろんな方法があって、
puts puts "Hello " + ARGV[0] puts puts "Hello #{ARGV[0]}" print "Hello #{ARGV[0]}\n" print "Hello " + ARGV[0] + "\n" だそうです。
やってみよ
これを用いてさっきの
hello_name.rb
を書き換える。puts "hello #{ARGV[0]}."それから
$ ruby hello_name.rb Rudy出る。
hello Ruby.リダイレクト(redirect)
標準出力をファイルに書き込む
Bash等にはファイルディスクリプタを変更する機能が備わっている。まぁゆうたら標準出力をターミナル画面に表示するんじゃなくてファイルに書き込める。
# ruby hello_name.rb bob > hello_name.txtってやったら、~hello_name.txt~ に出力結果が出力される(追記じゃなくて上書き)
# cat hello_name.txtをしてみると中身を見れる。
hello bob.ちなみにファイル最後尾に追記したいときは
# ruby hello_name.rb bob >> hello_name.txtみたいに
>>
ってする。両方とも、ファイルが無かったら新規に作成してくれる。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no5_1.org
- 投稿日:2020-11-27T18:37:34+09:00
第5回...の前に
Ruby … その前に
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
CUI
CUI はとても便利。しかし時には GUI の方が便利な時もある。だから CUI vs GUI ではなく、CUI × GUI で両方のいいところを用いて生産性を爆上げしよう。
ここで、生産性を左右するのはキーバインドが使えるかどうか。GUI でも CUI でも、キーバインドが左右する。
- (ex.) cmd+c, cmd+v, ctrl+a, ctrl+e
Shell
shell に命令を渡してやりとり。命令はコマンドと呼ばれる。
command は
$command [options] [arg0] [arg1] ...
が基本。
[]
は省略可能を意味し、options は-
あるいは--
の後ろに適宜入力。Directory
ディレクトリ(Direry) は Linux でコマンドを扱う上で理解が必須。
絶対パス
/Users/ryo/Documents/hogehoge.txt
- フルパスと呼ばれることもある。
- ルートディレクトリからの目的地までの経路を示す。
相対パス
./Documents/hogehoge.txt
- これはユーザーが作業中の位置をスタート地点として目的地までの経路を示す。
- 上記例ではユーザーが
/Users/ryo
で作業中であることを前提に hogehoge.txt を示すことができる。コマンド
超基本的だから説明は無しで羅列します。
- open <- Mac Only
- mkdir
- pwd
- cd [dir|..]
- ls
emacs
emacs はターミナル上で動作する高機能なeditor。
- 端末上で遠隔のファイル ( ssh サーバ等) を編集するのに向いている。(今は)
- マウスを使う前提で設計されてないのでキーバインドは必須。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no5_0.org
- 投稿日:2020-11-27T18:37:34+09:00
第5回...の前に、CUIと仲良くなりたい
Ruby … その前に
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
CUI
CUI はとても便利。しかし時には GUI の方が便利な時もある。だから CUI vs GUI ではなく、CUI × GUI で両方のいいところを用いて生産性を爆上げしよう。
ここで、生産性を左右するのはキーバインドが使えるかどうか。GUI でも CUI でも、キーバインドが左右する。
- (ex.) cmd+c, cmd+v, ctrl+a, ctrl+e
Shell
shell に命令を渡してやりとり。命令はコマンドと呼ばれる。
command は
$command [options] [arg0] [arg1] ...
が基本。
[]
は省略可能を意味し、options は-
あるいは--
の後ろに適宜入力。Directory
ディレクトリ(Direry) は Linux でコマンドを扱う上で理解が必須。
絶対パス
/Users/ryo/Documents/hogehoge.txt
- フルパスと呼ばれることもある。
- ルートディレクトリからの目的地までの経路を示す。
相対パス
./Documents/hogehoge.txt
- これはユーザーが作業中の位置をスタート地点として目的地までの経路を示す。
- 上記例ではユーザーが
/Users/ryo
で作業中であることを前提に hogehoge.txt を示すことができる。コマンド
超基本的だから説明は無しで羅列します。
- open <- Mac Only
- mkdir
- pwd
- cd [dir|..]
- ls
emacs
emacs はターミナル上で動作する高機能なeditor。
- 端末上で遠隔のファイル ( ssh サーバ等) を編集するのに向いている。(今は)
- マウスを使う前提で設計されてないのでキーバインドは必須。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no5_0.org
- 投稿日:2020-11-27T18:36:37+09:00
第9回
assert_equal
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
assert_equal は、イコール(両者が等しい)かどうかを確かめる関数。これを作っていく。とりあえず
思いつく範囲でとりあえず書いてみる。
def assert_equal(expected, result) return expected == result end p assert_equal(1, 1)これを実行する。
$ ruby assert_equal.rb trueよし。
色、つけてみる?
$ gem install colorizeしてから、
require 'colorize' def assert_equal(expected, result) if expected == result puts 'true'.green else puts 'false'.red end end assert_equal(1, 1) assert_equal(1, 2)みたいなプログラムを実行!
$ ruby assert_equal.rb true false
true
は 緑 、false
は 赤 になった!出力を豪華にしてみる?
require 'colorize' def assert_equal(expected, result) puts "expected :: #{expected}" puts "result :: #{result}" if expected == result puts 'succeeded in assert_equal.'.green else puts 'failed in assert_equal.'.red end end assert_equal(1, 1) assert_equal(1, 2)実行!
$ ruby assert_equal_richer_output.rb expected :: 1 result :: 1 succeeded in assert_equal. expected :: 1 result :: 2 failed in assert_equal.qiitaでは色変わらないけど、ターミナル上では変わってます。
まぁNot Equal もやるか〜
require 'colorize' def assert_not_equal(expected, result) puts "expected :: #{expected}" puts "result :: #{result}" if expected != result puts 'succeeded in assert_not_equal.'.green else puts 'failed in assert_not_equal.'.red end end assert_not_equal(1, 1) assert_not_equal(1, 2)簡単。
$ ruby assert_not_equal_richer_output.rb expected :: 1 result :: 1 failed in assert_not_equal. expected :: 1 result :: 2 succeeded in assert_not_equal.ファイルをまとめて汎用化
上の、イコールとノットイコールをまとめて、重複してる部分はまとめて、さらに外部からも呼び出します。まずは重複部分の整理
require 'colorize' def puts_vals(expected, result) puts "expected :: #{expected}" puts "result :: #{result}" end def assert_equal(expected, result) puts_vals(expected, result) print expected == result ? "succeeded in #{__method__}.\n".green : "failed in #{__method__}.\n".red end def assert_not_equal(expected, result) puts_vals(expected, result) print expected != result ? "succeeded in #{__method__}.\n".green : "failed in #{__method__}.\n".red end assert_equal(1, 1) assert_equal(1, 2) assert_not_equal(1, 2) assert_not_equal(1, 1)これを外部ファイルからも呼び出したい。
require './assert_equal' assert_equal(2, 1*2) assert_not_equal('bob', 'bob2')みたいな感じ。けど、外部から呼び出したら、tail の4行も実行されてしまう。これを避ける方法がある。
これはもう覚えるしかない。
if $PROGRAM_NAME == __FILE__ assert_equal(1, 1) assert_equal(1, 2) assert_not_equal(1, 2) assert_not_equal(1, 1) endこれは、実行中のプログラムのファイル名と、記述されているファイル名が一致したら、という構文である。例えば、上記コードが
A.rb
に記述されていて、B.rb
から呼び出されても実行されない。最終はこうなった。require 'colorize' def puts_vals(expected, result) puts "expected :: #{expected}" puts "result :: #{result}" end def assert_equal(expected, result) puts_vals(expected, result) print expected == result ? "succeeded in #{__method__}.\n".green : "failed in #{__method__}.\n".red end def assert_not_equal(expected, result) puts_vals(expected, result) print expected != result ? "succeeded in #{__method__}.\n".green : "failed in #{__method__}.\n".red end if $PROGRAM_NAME == __FILE__ assert_equal(1, 1) assert_equal(1, 2) assert_not_equal(1, 2) assert_not_equal(1, 1) endいい感じ!!今後の講義でもこのメソッドは活用するらしい。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no9.org
- 投稿日:2020-11-27T18:36:37+09:00
第9回、Rubyでassert_equal
assert_equal
本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
assert_equal は、イコール(両者が等しい)かどうかを確かめる関数。これを作っていく。とりあえず
思いつく範囲でとりあえず書いてみる。
def assert_equal(expected, result) return expected == result end p assert_equal(1, 1)これを実行する。
$ ruby assert_equal.rb trueよし。
色、つけてみる?
$ gem install colorizeしてから、
require 'colorize' def assert_equal(expected, result) if expected == result puts 'true'.green else puts 'false'.red end end assert_equal(1, 1) assert_equal(1, 2)みたいなプログラムを実行!
$ ruby assert_equal.rb true false
true
は 緑 、false
は 赤 になった!出力を豪華にしてみる?
require 'colorize' def assert_equal(expected, result) puts "expected :: #{expected}" puts "result :: #{result}" if expected == result puts 'succeeded in assert_equal.'.green else puts 'failed in assert_equal.'.red end end assert_equal(1, 1) assert_equal(1, 2)実行!
$ ruby assert_equal_richer_output.rb expected :: 1 result :: 1 succeeded in assert_equal. expected :: 1 result :: 2 failed in assert_equal.qiitaでは色変わらないけど、ターミナル上では変わってます。
まぁNot Equal もやるか〜
require 'colorize' def assert_not_equal(expected, result) puts "expected :: #{expected}" puts "result :: #{result}" if expected != result puts 'succeeded in assert_not_equal.'.green else puts 'failed in assert_not_equal.'.red end end assert_not_equal(1, 1) assert_not_equal(1, 2)簡単。
$ ruby assert_not_equal_richer_output.rb expected :: 1 result :: 1 failed in assert_not_equal. expected :: 1 result :: 2 succeeded in assert_not_equal.ファイルをまとめて汎用化
上の、イコールとノットイコールをまとめて、重複してる部分はまとめて、さらに外部からも呼び出します。まずは重複部分の整理
require 'colorize' def puts_vals(expected, result) puts "expected :: #{expected}" puts "result :: #{result}" end def assert_equal(expected, result) puts_vals(expected, result) print expected == result ? "succeeded in #{__method__}.\n".green : "failed in #{__method__}.\n".red end def assert_not_equal(expected, result) puts_vals(expected, result) print expected != result ? "succeeded in #{__method__}.\n".green : "failed in #{__method__}.\n".red end assert_equal(1, 1) assert_equal(1, 2) assert_not_equal(1, 2) assert_not_equal(1, 1)これを外部ファイルからも呼び出したい。
require './assert_equal' assert_equal(2, 1*2) assert_not_equal('bob', 'bob2')みたいな感じ。けど、外部から呼び出したら、tail の4行も実行されてしまう。これを避ける方法がある。
これはもう覚えるしかない。
if $PROGRAM_NAME == __FILE__ assert_equal(1, 1) assert_equal(1, 2) assert_not_equal(1, 2) assert_not_equal(1, 1) endこれは、実行中のプログラムのファイル名と、記述されているファイル名が一致したら、という構文である。例えば、上記コードが
A.rb
に記述されていて、B.rb
から呼び出されても実行されない。最終はこうなった。require 'colorize' def puts_vals(expected, result) puts "expected :: #{expected}" puts "result :: #{result}" end def assert_equal(expected, result) puts_vals(expected, result) print expected == result ? "succeeded in #{__method__}.\n".green : "failed in #{__method__}.\n".red end def assert_not_equal(expected, result) puts_vals(expected, result) print expected != result ? "succeeded in #{__method__}.\n".green : "failed in #{__method__}.\n".red end if $PROGRAM_NAME == __FILE__ assert_equal(1, 1) assert_equal(1, 2) assert_not_equal(1, 2) assert_not_equal(1, 1) endいい感じ!!今後の講義でもこのメソッドは活用するらしい。
- source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no9.org
- 投稿日:2020-11-27T17:58:27+09:00
Ruby 技術者認定試験 Gold に合格しました
はじめに
Ruby技術者認定試験 Silver 合格から半年たちましたが、
2020-11-27 に Ruby技術者認定試験 Gold に合格しました。
この記事が受験を考えている方の参考になれば幸いです。
勉強方法
勉強は次の4つを行いました。
- AtCoder
- 試験対策本
- 模擬試験
- web上の体験談
AtCoder
AtCoder さんの問題を引き続き解いております。
AtCoderの問題でクラスを使用する機会は少ないのですが、他の競技者のコードを読んだりすることにより、コードの読解力が深まると思います。使用頻度:中
試験対策本
試験対策本はSilverに引き続き次の本を使用しました。
Ruby技術者認定試験合格教本 Silver/Gold対応 Ruby公式資格教科書
サポートページ
第4章 オブジェクト指向と第5章 組み込みクラスを中心に読み返しました。
第8章 Ruby技術者認定試験Gold演習問題はさらさらっと見ただけで、もう少しやっておけば点数が取れたと思います。評判の
メタプログラミングRuby 第2版
は図書館で2回借りましたが、合わなかったようでほとんど読まなかったです。使用頻度:中
模擬試験
模擬試験問題は次のページを使用しました。
+ スマホでRuby試験勉強 | Ruby1問1答
+ REx - Ruby Examination上の2つは繰返し解くことができますので、学習効果が高いと思います。
Ruby1問1答
は本番より易し目、REx - Ruby Examination
は本番より難し目と思います。
お薦めは、Ruby1問1答を覚えない程度に毎日やることだと思います。使用頻度:高
web上の体験記
やはり頻繫に出題される問題や引っ掛かりやすい問題もあるようですので、体験記が役立ちます。
気軽に楽しくプログラムと遊ぶ
資格取得に40代後半からチャレンジ
Qiita にも沢山あります。使用頻度:特高
まとめ
試験勉強に一番のお薦めは、Ruby1問1答 です。
REx は難しいので心が折れる
毎日、少しずつやる事が定着につながると思います。
但し、問題数に限りもあり幅が狭くなると思われますので、試験対策本で補う必要はあると思います。
ある程度自信が付いたところで、体験記を参考に仕上げをやるといいと思います。最後に、Qiitaの記事にコメントをいただいた皆様に感謝を申し上げます。
ruby.rbbegin puts "Ruby Gold" + "を受験しょう".to_str rescue p "StandardErrorとそのサブクラス".inspect ensure print "Happy Programming".to_s end
- 投稿日:2020-11-27T17:22:07+09:00
Rails seedファイルによる初期データの設定
HerokuでRailsアプリをデプロイした際に自身のアプリケーションでは管理権限のあるユーザーしかユーザーを作成出来ない仕様のアプリケーションなのですが、root画面がログイン画面なので操作出来ないと思い色々考えていたらseedファイルという便利なものがあるのを知り導入しました。
seedファイルとは
初期データを記述できるファイルです。これがある事で上の件であったり、データベースを作り直す度にテストユーザーの作成時間を短縮する事が出来ます。
db/seeds.rbに記述します。
User.create!( name: 'テスト', email: 'test@test.com', password: 'xxxxxx', admin: true )開発環境に反映する
$rails db:seedHeroku: 本番環境に反映する
heroku run rake db:seed↑がないと本番環境に反映されません。
ちなみになんですが恥ずかしながら、HerokuでもRails cが使えるのを知らなかったです。
- 投稿日:2020-11-27T17:04:43+09:00
[Rails]deleteメソッドとdestroyメソッドの違いについて!![初心者]
はじめに
先日、とあるアプリケーションを作成していて、
deleteメソッド
とdestroyメソッド
のどちらを使うべきか、分からなくなってしまったので、備忘録も兼ねてアウトプットします!!deleteメソッドについて
指定した条件のレコードを、SQLを直接実行することで削除します。
ActiveRecordを介さないということなので、モデルを経由しません。
また、モデルで関連付けされているレコードがあったとしても、そちらは削除されません。User.find(id: 1).deletedestroyメソッドについて
ActiveRecordを介して、指定した条件のレコードを削除するメソッドです。
モデル内で、dependent: :destory
が設定されていれば、関連付けされているデータも併せて削除されます。
ActiveRecordを介しているので、callback
メソッドやバリデーションを機能させることもできます。メソッドの実行時にエラーが発生し、削除ができなかった場合は、
false
を返すだけで、例外は返却されません。
なので、「とりあえずデータを削除したいが、失敗した場合はエラーを返却してほしいな...」という場合は、destroy!メソッド
を使用すれば大丈夫です。User.find(id: 1).destroy例えば、Userモデルに多数のBookモデルが関連付けされている場合、
id: 1
のユーザーが投稿したbook
に関しても、同時に削除がされることになります。ActiveRecordって何なん??
ActiveRecordとは、
RubyとSQLの翻訳機
のようなイメージです。本来、DBで使用されるDB言語には、SQLが使用されています。
しかし、Railsが開発してくれているActiveRecord
のおかげで、我々はRuby
を使用して、DBからデータを探したり、持って来れたり出来るというわけなのです!!
非常に便利な機能ですね。delete_allとdestroy_allについて
まとめて紹介しますが、こっちを使用すると、条件に合致する
複数
のレコードを同時に削除することが可能です。
whereメソッド
と同時に使われることが多いです!!Book.where(user_id: 1).delete_all Book.where(user_id: 1).destroy_allおわりに
Railsには、似通っている機能が多数存在するので、混乱することも多いですが、一つ一つ丁寧に理解していくことが、上達への近道になりそうですね。
- 投稿日:2020-11-27T16:20:42+09:00
railsでマイグレーションファイルを編集する際に行う事(rails db:rollback)
マイグレーションファイルを編集したい
マイグレーションファイルの記述を間違えてしまった、コードを付け加えたいと思った時は、行う手順があります。
まずはマイグレーションファイルの状態を確認します。
% rails db:migrate:status Status Migration ID Migration Name -------------------------------------------------- up 20201119073257 Devise create users up 20201120031505 Create coordinations up 20201120032421 Create active storage tablesactive storage今回はusersのマイグレーションファイルを編集を行いますので次のコマンドを実行します。
rails db:rollback再度statusコマンドでマイグレーションファイルの状態を確認します。
% rails db:migrate:status Status Migration ID Migration Name -------------------------------------------------- up 20201119073257 Devise create users up 20201120031505 Create coordinations down 20201120032421 Create active storage tablesactive storageこれではusersのマイグレーションファイルがdownになっていないので編集出来ません。
ロールバックコマンドを行うと直近のマイグレーションファイルのみがdownになり編集出来る状態になります。
今回のusersマイグレーションファイルのように、最後から3つ目のマイグレーションファイルを編集、変更したい場合はrails db:rollback STEP=3とSTEP=○を追記すると一度でusersマイグレーションファイルまでdownにすることが出来ます。
rails db:migrate:status Status Migration ID Migration Name -------------------------------------------------- down 20201119073257 Devise create users down 20201120031505 Create coordinations down 20201120032421 Create active storage tablesactive storageSTEP=○ ←○の中には最後に行ったマイグレーションファイルからrollbackを行いたいマイグレーションファイルまでいくつのマイグレーションファイルが含まれているか数えてその数字を入れてあげればうまくいきます。
最後を含め3つ目ならrails db:rollback STEP=3
4つ目ならrails db:rollback STEP=4最後に
これでマイグレーションファイルの変更を行うことが出来ます。
変更が完了したらマイグレーションを実行をお忘れずに!
- 投稿日:2020-11-27T15:42:20+09:00
Cygwin環境のRubyからExcelファイルを読み書きする(rubyXLの環境構築)
はじめに
RubyからExcelファイルを読み書きするにはrubyXLがよさげです。
https://github.com/weshatheleopard/rubyXL
このgemをインストールするには
gem install rubyXLでいけると書いてあるが、実際にはrubyXLはnokogiriというgemに依存している。
更にnokogiriはlibxml2等様々なライブラリに依存しており、
インストールするには gcc や make なども必要になりやや複雑です。今回はCygwin環境で rubyXL をインストールする方法をご紹介いたします。
Cyginのパッケージを入れる。
setup-x86_64.exeで以下のパッケージを入れておきます。
- ruby
- ruby-devel
- libxml2-devel
- libiconv-devel
- libxslt
- libxslt-devel
- gcc-core
- make
インストール
gem install nokogiri -r -- --use-system-libraries gem install rubyXL -rこれで cygwinで rubyXL が使えるようになります。
- 投稿日:2020-11-27T12:52:26+09:00
【Rails】AWSデプロイ中にCould not find aws-eventstream-1.1.0 in any of the sources Run `bundle install` to install missing gems.
EC2内でDBを作成しようとしたところエラーが出て詰まったので忘備録として書きます
EC2内でデータベースを作成しようと下記のコマンドを実行したところ
ターミナル(EC2内で実行)
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ rails db:create RAILS_ENV=production
Could not find aws-eventstream-1.1.0 in any of the sources
Run `bundle install` to install missing gems.
とエラー
どうやらどのソースでもaws-eventstream-1.1.0が見つかりませんでしたbundle install
を実行して、不足しているgemをインストールします。と言われているよう...
まずGemfileをのぞくが
Gemfile
gem "aws-sdk-s3", require: false
一番下に記述はしっかりあることを確認。
Gemfile.lockをのぞきにいくが
63行目に以下の記述は入っている
Gemfile.lock
aws-eventstream (1.1.0)
bundleinstallのし忘れかと思い履歴を見るがしっかりEC2内にて参考資料通り実行済み、
作業を一度ふり返るが特にミスした形跡も見当たらずもちろんググってみるがあまり参考になる記事も見つけられず。
どうやら開発環境ではaws-eventstream (1.1.0)は存在するが本番環境では適用されてないのだとあたりをつけて念のためもう一度bundle install
ターミナル(EC2内)
[ec2-user@ip-10-0-0-25 <リポジトリ名>]$ bundle install
Using actionmailer 6.0.3.3
Using actiontext 6.0.3.3
Using public_suffix 4.0.6
Using addressable 2.7.0
Using ast 2.4.1
Fetching aws-eventstream 1.1.0
Installing aws-eventstream 1.1.0
Fetching aws-partitions 1.399.0
Installing aws-partitions 1.399.0
Fetching aws-sigv4 1.2.2
Installing aws-sigv4 1.2.2
Fetching jmespath 1.4.0
Installing jmespath 1.4.0
Fetching aws-sdk-core 3.109.3
Installing aws-sdk-core 3.109.3
Fetching aws-sdk-kms 1.39.0
Installing aws-sdk-kms 1.39.0
Fetching aws-sdk-s3 1.85.0
Installing aws-sdk-s3 1.85.0
と、どうやらinstall されていなかったようです。
再度
ターミナル(EC2内)
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ rails db:create RAILS_ENV=production
Created database '<データベース名>'
と成功!!
今回原因はbundleinstallし忘れだったようだが、他のgemはしっかり反映されてたのでそれが原因突き止められなかったがしっかり一つ一つ検証していき可能性を消していく作業が大事だと感じた。
同じような症状で悩まれるかたに是非参考になればと思い書かせていただきました。最後まで読んでいただきありがとうございました。
- 投稿日:2020-11-27T10:54:47+09:00
Railsのrouting設定について
本投稿の目的
・Rails学習の議事録です。
学習に使った教材
Udemyの以下2つの教材を参考にまとめました。
・"はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう"
・"フルスタックエンジニアが教える 即戦力Railsエンジニア養成講座"
○RESTfull
・HTTPメソッドにそってWebのリソースを設計する設計思想
・RailsのRouting設定はこの思想を表現したようなもの【HTTPメソッド】
・GET リソースの取得
・POST リソースの作成
・PATCH/PUT リソースの更新
・DELTE リソースの削除○Routingとは?
以下の①~④を指定する設定
①どのHTTPメソッドで
②どのurlへアクセスした際に
③どのcontrollerの
④どのアクションを実行するか○Routing設定方法
・/config/routes.rb を開く
・このファイルを編集することでrouting変更が可能
*(rails g controller アクション名で記述したroutingが自動記述済み)【rootの設定】
・urlに"/"でアクセスした際のrouting設定
・以下を記述 (*アクション名は"#"で記載することに注意)qiita.rbroot 'controller名#アクション名''【例:rootでquestions controllerのindexアクションを実行したい場合】
qiita.rbroot 'questions#index'【書き方①】
・HTTPメソッドでPrefix_pathのurlへアクセスするとtoo以降のcontrollerでアクションを実行
・という設定を意味する
・以下を記述 (Prefixの部分は _pathを除くことに注意)qiita.rbHTTPメソッド 'Prefix(_pathは除く)', too: 'controller名#アクション名'【例:boards controllerのnewアクションを想定】
qiita.rbget 'boards/new', too: 'boards#new'【書き方②】
【基本的な記述】
・Railsでdefaultで設定された分のroutingが自動で設定可能
・以下を記述qiita.rbresources :controller名【応用的な記述】
・指定したアクション名のみをroutingで設定可能
・以下を記述qiita.rbresources :controller名, only: [:アクション名1, :アクション名2]【例:questions controller を想定】
・questions controller のindex,create,new,showに関連するroutingのみ自動設定qiita.rbresources :questions, only:[:index :create :new :show]○Routing確認方法
【確認方法①(ターミナル)】
・ターミナルに以下を記述rails routes*【出力結果】
・今回は 【例:questions controller を想定】 の条件下での場合の出力結果Prefix Verb URI Pattern Controller#Action questions GET /questions(.:format) questions#index POST /questions(.:format) questions#create new_question GET /questions/new(.:format) questions#new question GET /questions/:id(.:format) questions#show【解説】
・Prefix_pathで定義されたurlへアクセスした際に,それぞれのcontrollerのアクションを実行する
・これらは,routes.rbで設定したため作成された設定である【確認方法②(Webブラウザ)】
・/rails/info/routes のpathにアクセス
・設定済みのルート情報を確認
- 投稿日:2020-11-27T10:20:19+09:00
【Ruby】FizzBuzzの問題
こんにちは、あおい( https://twitter.com/aoi_programming )です。
今回はRubyのFizzBuzz問題を解いていきます!いくらRuby on RailsでWebアプリケーションを開発できるようになっても、それはRubyのフレームワークに過ぎないので、プログラミングの本質を磨くには生のRubyを勉強する他ないと思いまして、これからは、Ruby本体も毎日コツコツ勉強していこうかと。
そこで、今回は初心者プログラマーがまずぶち当たる壁「FizzBuzz」の問題に挑戦してみます。
もっと良いコードがあればご提示していただけると嬉しいです!RubyのFizzBuzz問題
- 3で割り切れる数値を引数に渡すと「Fizz」と返す
- 5で割り切れる数値を引数に渡すと「Buzz」と返す
- 15で割り切れる数値を引数に渡すと「FizzBuzz」と返す
- それ以外の数値はその数値を文字列に変えて返す
- 改行はしない
- ひとつの数字につき、間に「,(カンマ)」をいれる
問題は上記の通りです。
実行方法は以下の通りです。実行方法
% ruby test.rb 数字を入力してください。 # 31の場合 1,2,Fizz,4,Buzz,Fizz,7,8,Fizz,Buzz,11,Fizz,13,14,FizzBuzz,16,17,Fizz,19,Buzz,Fizz,22,23,Fizz,Buzz,26,Fizz,28,29,FizzBuzz,31それでは実装していきましょう。
※これより下は答えとなります。回答
test.rbdef fizzbuzz(nums) nums.times do |num| num += 1 if num % 15 == 0 print "FizzBuzz" elsif num % 3 == 0 print "Fizz" elsif num % 5 == 0 print "Buzz" else print num end if num == nums print "" else print "," end end end puts "数字を入力してください" n = gets.to_i fizzbuzz(n)
- 投稿日:2020-11-27T09:42:24+09:00
【Ruby】puts / printの違い
- 投稿日:2020-11-27T05:59:07+09:00
Sorceryで複数モデルを扱う
Sorcery
https://github.com/Sorcery/sorcery
How
例: AdminモデルとUserモデルが存在して、両方でSorceryを使いたい場合
前提として、AdminかUserのどちらかでSorceryの導入が完了しているusers_controllerdef current_user User.find_by(id: session[:user_id]) endconfig/initializer/sorcery.rbconfig.user_class = 'Admin'こうすると指定したcontroller内だけでcurrent_userの中身がuserになり、それ以外ではadminになる
上記のuserとadminを逆にしてもいいので、あまり使わない方をcontrollerに指定するとよさそうcurrent_userがセットされているので、
before_action :require_login
も普通に動くSingle Table Inheritanceを使うやり方もあるらしいがこっちがシンプル
- 投稿日:2020-11-27T03:51:44+09:00
【Ruby ~条件分離~】勉強メモ2
Rubyの復習。
ほぼ自分の勉強メモです。
過度な期待はしないでください。変数展開
変数展開とは、変数を代入している値に置き換えて、文字列に含めること
書き方:#{変数名}
例length = 9 width = 8 area = length * width puts "面積は#{area}です"出力結果面積は72です
※変数展開の注意点
シングルクォーテーションを使った場合は、変数展開が行われず、
そのまま文字列として出力されてしまうので注意。例length = 9 width = 8 area = length * width # シングルクォーテーションを使った場合 puts '面積は#{area}です'出力結果面積は#{area}です
条件分岐
条件分岐処理とは、条件を満たしているかどうかで実行内容を分岐する処理。
「もし〇〇だったら△△をする」と処理を分けることが出来る。
- 書き方は下記の通り
書き方if 条件式 処理 end例score = 92 if score > 80 puts "値は正です" end出力結果値は正です
- elseの書き方
ifにelseを組み合わせると「もし〇〇なら●●を行う、そうでなければ■■を行う」という処理が出来るようになる。
書き方if 条件式 # 条件式が真(true)のときに実行する処理 else # 条件式が偽(false)のときに実行する処理 end例score = 60 if score > 80 puts "値は正です" else puts "値は負です" end出力結果値は負です
- elsif (条件を追加する)
ifとelseだけでなく、さらに条件を追加したい場合使用する。
書き方if 条件式1 # 条件式1が真(true)のときに実行する処理 elsif 条件式2 # 条件式1が偽(false)のとき、かつ # 条件式2が真(true)のときに実行する処理 else # 条件式1と条件式2がどちらとも偽(false)のときに実行する処理 end例value = gets.to_i if value > 0 puts "値は正です" elsif value < 0 puts "値は負です" else puts "値は0です" end
- 条件を組み合わせ
-「かつ」
かつは、「&&」
で表す。
「条件1 && 条件2」は「条件1かつ条件2」という意味で、複数の条件がすべてtrueならtrueになる。
-「または」
「または」は、「||」
で表す。
「条件1 || 条件2」は「条件1または条件2」という意味で、この場合は、複数の条件のうち1つでもtrueならtrueになる。例score = 96 # 「95以上かつ99以下」の場合のif文 if score>=95 && score<=99 puts "高得点です。" end出力結果高得点です。
今迄の応用number = gets.to_i if number%3==0 && number%5==0 puts "15の倍数です" elsif number%5==0 puts "5の倍数です" elsif number%3==0 puts "3の倍数です" else puts "3の倍数でも5の倍数でもありません" end
過去投稿記事
- 投稿日:2020-11-27T03:51:44+09:00
【Ruby ~条件分岐~】勉強メモ2
Rubyの復習。
ほぼ自分の勉強メモです。
過度な期待はしないでください。変数展開
変数展開とは、変数を代入している値に置き換えて、文字列に含めること
書き方:#{変数名}
例length = 9 width = 8 area = length * width puts "面積は#{area}です"出力結果面積は72です
※変数展開の注意点
シングルクォーテーションを使った場合は、変数展開が行われず、
そのまま文字列として出力されてしまうので注意。例length = 9 width = 8 area = length * width # シングルクォーテーションを使った場合 puts '面積は#{area}です'出力結果面積は#{area}です
条件分岐
条件分岐処理とは、条件を満たしているかどうかで実行内容を分岐する処理。
「もし〇〇だったら△△をする」と処理を分けることが出来る。
- 書き方は下記の通り
書き方if 条件式 処理 end例score = 92 if score > 80 puts "値は正です" end出力結果値は正です
- elseの書き方
ifにelseを組み合わせると「もし〇〇なら●●を行う、そうでなければ■■を行う」という処理が出来るようになる。
書き方if 条件式 # 条件式が真(true)のときに実行する処理 else # 条件式が偽(false)のときに実行する処理 end例score = 60 if score > 80 puts "値は正です" else puts "値は負です" end出力結果値は負です
- elsif (条件を追加する)
ifとelseだけでなく、さらに条件を追加したい場合使用する。
書き方if 条件式1 # 条件式1が真(true)のときに実行する処理 elsif 条件式2 # 条件式1が偽(false)のとき、かつ # 条件式2が真(true)のときに実行する処理 else # 条件式1と条件式2がどちらとも偽(false)のときに実行する処理 end例value = gets.to_i if value > 0 puts "値は正です" elsif value < 0 puts "値は負です" else puts "値は0です" end
- 条件を組み合わせ
-「かつ」
かつは、「&&」
で表す。
「条件1 && 条件2」は「条件1かつ条件2」という意味で、複数の条件がすべてtrueならtrueになる。
-「または」
「または」は、「||」
で表す。
「条件1 || 条件2」は「条件1または条件2」という意味で、この場合は、複数の条件のうち1つでもtrueならtrueになる。例score = 96 # 「95以上かつ99以下」の場合のif文 if score>=95 && score<=99 puts "高得点です。" end出力結果高得点です。
今迄の応用number = gets.to_i if number%3==0 && number%5==0 puts "15の倍数です" elsif number%5==0 puts "5の倍数です" elsif number%3==0 puts "3の倍数です" else puts "3の倍数でも5の倍数でもありません" end
過去投稿記事