Edited at

【初心者過ぎて聞くのが恥ずかしい事は】僕の知りたかったrailsとgemのtipsまとめ【全部Googleが教えてくれた】

More than 1 year has passed since last update.


概要

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がそこを認識してくれませんので、認識してくれるようにします。


config/applications.rb

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が動くのか、と言う設定ですね。


config/routes.rb

    mount Test_api => "/test_api/"



せつめいしょどおり?

ルーティングで「TestAPI」としたならば、moduleも「TestAPI」とするのがコツです。

ファイル名は別に何でもいいと思う。


test_api

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ヶ月前の自分に教えたいので、まとめてみた

2.Rails Jbuilderの使い方


キーの配列を使いたい

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

テストコードを書くときに使うものですが、

日付のテスト等をするときに便利なものです!

RailsでTimecopを使って日付/時間のテストをする


wheneverを使おう

cronって皆さん知ってます?

エンジニアやってて1年目な私ですが、

知ってはいて使ったことなかった。

でもrailsだととても簡単に設定できるよ!

ということでその簡単に設定するためのgemを使ってみたので共有します。

参考:gemのwheneverを導入してみた @まっしろけっけhatenaBlog


rails_adminで簡単管理画面!

即席管理画面が欲しかったらこれ!

すぐに作れるぞ!やったね!

sferik/rails_admin @github


まとめ

書き上がってみるとターゲットとは一体なんだろうというくらい

色々書いてますね。

本とか書いてる人は本当にすごいなぁ...

それでは、お疲れ様でした。