#概要
Perfect Ruby on Railsを読んで基本的なことはそれとなく知っている初心者(つまり、僕)というターゲットで記事書いてます。
【参考になる人】
- とりあえず、便利そうなの入れてみたけど英語読むのだるい。
- こんなことで人に聞くのはちょっとなぁ。
- これ知っとけば検索に使える!
【参考にならない人】
- Rubyなんて片手間で遊ぶものよ
- ( ´,_ゝ`)クックック・・・( ´∀`)フハハハハ・・・( ゚∀゚)ハァーハッハッハッハ!!
いつものことながら僕のための備忘録ですが、頑張って分かりやすいように纏めるよ!
正しくない解釈(動きから察するに、こういうものでしょ? 見たいな)が沢山あると思いますが
都度皆さんで上手く咀嚼して下さい。
※随時更新していくかもしれません。
Ruby編
##PHPとの違い
根本的な違いを知りたい方は他所へGO!
僕が感じた超表面上のことだけ言うなら
- セミコロンが要らない
- def end でメソッドぽいのが書ける
- 特にリターンとか書かなくても最終行が返り値になるっぽい
- 「if elsif end」if分がちょっといつもと違って変(ぇ
- etc...
うぅ、ruby怖い、ruby怖い。
でも慣れるともうセミコロンなんて打ちたくないお(^ω^)
ってなるので、きっと怖くないです。
'||=' とか '&&=' ってなに?(自己代入)
PHPやっているときは一度も見なかったのですが...
自己代入という仕組みがRubyにはあるようです。(PHPにもあったら御免なさい)
論理演算子の自己代入について、ほとんどのRubyテキストで誤った説明をしている
このサイト様が詳しく説明しているかと思います。
:【追記】:
『a ||= b』は『a = a || b』ではなく『a || a = b』とほぼ同じ意味、と覚えましょう - わからん
により詳しく説明が乗っているようです!
riocampos様紹介有難うございます!
Rails編
なんかよくわかんないメソッドがあったら
Railsドキュメント
此処から探すと並大抵のことは解決すると思いますが、その中でも僕が
これは覚えておくと楽だなぁというのを抜粋します。
##コマンド
ファイルのジェネレートとか。
この方の記事が参考になります。
いつも忘れる「Railsのgenerateコマンド」の備忘録
でも基本的に
$ rails g scaffold
$ rails g generate controller NAME
これだけ覚えておけば作り始めは困らないと思う。
必要に応じて覚える量増やしていけば、困ったときに調べれば済むことなので
やり始めは暗記しなきゃ!と意気込む部分でも無いです。
##view
特に書くこともないです。
ほかのサイトさん調べればいっぱい出てくる箇所だと思います。
phpで吐き出すときは
<?php echo 'phpだお'; ?>
<?= $php_dao; ?>
こうなのが
rubyだと
<% 'rubyだお' %>
<%= @ruby_dao %>
これくらいの違いですかね。
##controller
cakePHPとかやっていれば、大体何をする部分かわかると思いますが、
とりあえず抑えておいたほうがいいなぁと思うのを紹介します。
render
cakePHPでも有りますね。
何つかって描画しよう?ってやつです。
render :template = コントローラ名/アクション名, :layout => レイアウト名
だいたいこんな感じで使われるのかなと思います。
URLとコントローラーに書いてあること一致しないぞぉ!?
と思ったら大体renderさんが何かしているorルーティングの設定
が原因(?)なので疑ってみましょう!
before_action
controller内でメソッドを定義した後、
class testController < ApplicationController
before_action :check_login!
みたいに書くことで先にcheck_login!として定義したメソッドを先に動かすことが出来ます!
もしログインしてなかったらリダイレクトするというような処理を
全体で先んじてやりたい!
なんてときに非常に便利です。もし、一部のアクションでだけそうさせたいときは
before_action :check_login!, only: [:home]
なんて書くと良いです。
private と protectedとか
Java(というかオブジェクト指向言語)を使っていると見覚えがあると思いますが、
ruby on railsだと
public => public に設定されたメソッドは制限なしに呼び出せます。
protected => protected に設定されたメソッドは、そのメソッドを持つオブジェクトが self であるコンテキスト(メソッド定義式や instance_eval )でのみ呼び出せ ます。
private => private に設定されたメソッドは関数形式でしか呼び出せません。
と言うものらしいです。参照:Ruby 2.1.0 リファレンスマニュアル > クラス/メソッドの定義
このメソッドはこのコントローラーでしか使いません!(private)など明示的にしたり、使える幅を限定的にしたり便利で、使い方は多そうです。(まだ使いこなせてない)
この方の記事が参考になると重いますので、詳しくはコチラ!
Ruby | Ruby の private と protected 。歴史と使い分け
###スタックトレースとerror catch的な奴。
参考 ■ もっと簡単にデバッグ用にメソッドの呼び出し元(スタックトレース)をログに出力する方法 @まちゅダイアリー
javaとかでいうerror catchは
ruby on rails だと begin resuce に該当します。
これでガンガンバグをキャッチしてログに残せるぜ!
って時でも、コンソールで叩いてる時に、何が起こってるかエラー全文みたいなぁというと気には
スタックトレースしましょう。
詳しくは参考をどうぞ!
#例外オブジェクト
begin
raise Exception.new
rescue Exception => e
STDERR.puts e.backtrace.join(", ")
end
#caller
def some_method
STDERR.puts caller.join(", ")
end
###日付データのフォーマットってどうするの。
+0900ってなんだよ消したい!
そんなあなたに。
日付データをフォーマット(strftime) @Railsドキュメント
@time = Time.strftime("%Y-%m-%d %H:%M:%S")
#=>2000:01:01 11:11:11
こんな感じに表示できますよ!
##model
Railsのモデルの作成、検索、更新、削除のよく使うメソッドのまとめ
簡単な操作はここによくまとめられております。
非常に助かります><
###結合というかリレーションがよくわかんねぇ(Active Record の関連付け (アソシエーション))
railsで最初に3大苦労するポイントがリレーションです。(一つはセットアップ、もう一つがコロコロ変わるmigrateの対応だと思う。)
これを知らずにモデル設計しようものなら(面倒なことになって)死んでしまいます。
まずは此方を確認してからモデルに挑みましょう。
Active Record の関連付け (アソシエーション)
わかります?
僕はちょっと噛み砕くのに時間がかかりました。
僕なりに纏めると、
customer(顧客テーブル)がorder(注文テーブル)したデータを保存しておくという関係だと
orderが「誰が注文しました」という情報を保持しておかないといけません。(customer_id)
という時に、
customerはhas_many :orders(顧客データに複数の注文情報)
orderはbelongs_to :customer(一つの注文に一つの顧客情報)
というような関係になるわけです。
テーブルが3つになっても解釈の方法は同じ感じで
患者 Physician
予約 Appointment
医者 Patient
なら、
1人の医者が複数の患者を見ます。
1人の患者は複数の医者に見られます。
診察予約はどの医者と、どの患者が出会ったのか記録しています(Physician.idとPatient.id)
という関係であることから、
class Physician < ActiveRecord::Base
has_many :appointments
has_many :patients, through: :appointments
end
class Appointment < ActiveRecord::Base
belongs_to :physician
belongs_to :patient
end
class Patient < ActiveRecord::Base
has_many :appointments
has_many :physicians, through: :appointments
end
このような設定にすればいいんだなと理解できると思います。
throughというのは、throughで設定したテーブルを通して、has_manyなデータを取得するという意味です。
このような設定をすることで、
1人の医者がみた患者のデータ。
Patient.find(id). physicians
1人の患者を診察した医者のデータ。
Physician.find(id).patients
というようなデータが取ってこれるようになるわけですね。
この辺は慣れですので頑張りましょう!
モデルのいんすたんすなんだけど?
インスタンスといえば「@」これを付けるあれですね。
@model_data = Model.find(1)
@model_data.id
#=> 1
とかでmodelsテーブルからidが1のデータをmodel_dataに入れることが出来ます。
勿論find(1)でやったんでmodel_data.idは1です。
って出来るじゃないですか。
model_data = Model.where('model_flag = ? ', true);
p model_data.id
#=> error
こんな感じでやると、怒られます。
それデータが複数だから怒られるんじゃない?
と思われるかもしれませんが、仮にとれたデータが一つだとしても怒られます。
一個だから出来てもいいじゃん!なんでfindじゃないと駄目なの?
と思って調べたのですが
find :オブジェクト一個返すよ。
where :配列でオブジェクト返すよ。
ということらしく、配列になっているみたいですね。
ならwhereでやった後とかなら
model_data.each do |data|
p data.id
end
model_data.first
p model_data
#=> 該当するid
と、することで確実にオブジェクトとして取り出すことで
ようやっとやりたい事ができるようになるわけですね。
Gem編
僕が使ったGemを紹介します。
##Grape
APIが簡単に出来て良いね!
という奴。
参考:
1.Grape + Railsで、Jbuilderを使ったJSONフォーマットAPIを作る
###使い方
gem 'grape'
1, Gemfileに記述して、bundle installしましょう!
2, apiを置く場所を決めましょう。
app/api 以下にapiを作ったと仮定しまして。
3, 自動読み込み対象に登録。
4, ルーティングを決める。
5, 後はgrapeの説明通りにやればOK!
###じどうよみこみ?
rails sした時にappの中身を読み込んで、表示とか色々やるんですけど、apiとフォルダを新しく作るとrailsがそこを認識してくれませんので、認識してくれるようにします。
module sample
class Application < Rails::Application
# Railsの自動読み込み対象に/api/以下を登録の意味
config.paths.add "app/api", glob: "**/*.rb"
config.autoload_paths += Dir["#{Rails.root}/app/api/*"]
###るーてぃんぐ?
どういうURLで接続したらAPIが動くのか、と言う設定ですね。
mount Test_api => "/test_api/"
###せつめいしょどおり?
ルーティングで「TestAPI」としたならば、moduleも「TestAPI」とするのがコツです。
ファイル名は別に何でもいいと思う。
module Test_api
class API < Grape::API
version 'v1', using: :path
format :json
formatter :json, Grape::Formatter::Jbuilder
# プライベートメソッド
helpers do
def meth
"test?"
end
end
resource :test do
get :test2 do
"test " + meth
end
end
end
end
ここまできたら
/test_api/v1/test/test2
のような感じで接続すれば
test test?
と出力されるはず。
##jbuilder
JSONの出力が超簡単になるよ!
という奴。
参考:
1.PHPerがRailsデビューしてWebAPIを作りRSpecでテスト書いてCap3/CircleCIでデプロイして分かった事を1ヶ月前の自分に教えたいので、まとめてみた
###キーの配列を使いたい
json.num [1, 5, 10]
# =>[num [1, 5, 10]]
json.array! [1, 5, 10]
# =>[1, 5, 10]
##Grape + jbuilder
合わせて使うことで簡単にjson出力できるAPIができます!
参考:
1.Grape + Railsで、Jbuilderを使ったJSONフォーマットAPIを作る
jquery-ui-rails
まぁ普通のjqueryのgemなのですが、素直に動いてくれませんでした。
アセットパイプラインとやらが普通に動いていれば問題無いそうなのですが...
(RailsにjQuery-uiを導入するときの注意)[http://qiita.com/hachi8833/items/42d50928008d1b3f6400]
もし同じような現象にあった時は、試してみてください!
ranked-model
データの管理画面を作るときになんかちょうどいいのないかなぁと思って探してみると
Rails 4で作るドラッグアンドドロップで表示順を変更できるサンプルアプリ(スクリーンキャスト付き)
(^ω^)いいのが在るではないですか!
とても便利でしたので、似たようなものを考えている方は是非!
json_expressions
友達に教えてもらったものなので、ちょっとまだノウハウが溜まってませんが
APIのテストコートを書くときに「JSONの出力結果に合わせるの面倒くさいなぁ」
となりますよね。そんな時に便利でした!
あまり使い方について記事がないのですが
Rails でつくる API のテストの書き方(RSpec + FactoryGirl)
この方が最後のほうでちらっと使っているのが参考になるかと思います。
timecop
友達に教えてもらったものなの(ry
テストコードを書くときに使うものですが、
日付のテスト等をするときに便利なものです!
wheneverを使おう
cronって皆さん知ってます?
エンジニアやってて1年目な私ですが、
知ってはいて使ったことなかった。
でもrailsだととても簡単に設定できるよ!
ということでその簡単に設定するためのgemを使ってみたので共有します。
参考:gemのwheneverを導入してみた @まっしろけっけhatenaBlog
rails_adminで簡単管理画面!
即席管理画面が欲しかったらこれ!
すぐに作れるぞ!やったね!
まとめ
書き上がってみるとターゲットとは一体なんだろうというくらい
色々書いてますね。
本とか書いてる人は本当にすごいなぁ...
それでは、お疲れ様でした。