Rails関連の備忘録
Railsを使っている際に知ったRuby備忘録
||=
の意味(使う)
自己代入→a ||= 1
a が偽か未定義ならば1を代入。初期化時のイディオムの一種。
クラス内でのself.の扱い方(特異メソッド)
参考サイト:http://rails.hatenadiary.jp/entry/2013/02/15/125047
今回は、sessionを用いたログイン実装で利用
def user.correct_password?(******)
で設定したものを別のクラスで
def correct_password?(input_password)
self.password == input_password.to_s
end
として、selfで 元のクラスにあった、userをそのまま持って来れる(今回では、配列が入ったオブジェクトとしてuserを定義し、selfで持ってきた)
この場合はselfは疑似変数と呼ばれる
クラス内でのインスタンスメソッドの動きについては、こちらが分かりやすい
http://blog.livedoor.jp/sasata299/archives/51302623.html
selfがどのように、利用されているかが実行結果で分かる
※ちなみにjavaではthisというらしい
http://ja.wikipedia.org/wiki/This_%28%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%29
特異メソッドについて(参考サイト)
さらに、クラスメソッドとインスタンスメソッドについては、こちらでも
http://nigohiroki.hatenablog.com/entry/2014/03/12/010344
クラスメソッドの場合
- Dogのうち一番年齢の高いDogを取り出すメソッド
- Dogのうちオスのみを取り出すメソッド
例えばこんな感じ
class Dog < ActiveRecord::Base # 一番年齢の高いDog def self.get_oldest self.order("age DESC").limit(1) end # オスのみを取り出す def self.get_male self.where(:sex => "male") end end
要は「クラス全体の中から何かを取り出す」場合などに利用されます。
インスタンスメソッドの場合
とあるDogの年齢、性別をHashで取り出すメソッド
とあるDogの親のDogを取り出すメソッド(親が子のIDを持っているケース)
class Dog < ActiveRecord::Base
# 年齢、性別
def get_profile
{ :age => self.age, :sex => self.sex }
end
# 親を取り出す
def get_parent
Dog.where(:child => self.id)
end
end
こちらは「あるインスタンスの何かを取り出す」場合などに利用されます。インスタンスメソッドの場合は更新系もよく出てくるかと思います。
class << self(特異クラス)について
参考サイト:http://magazine.rubyist.net/?0046-SingletonClassForBeginners
class Bar def hello puts 'hello' end class << self def bye puts 'good bye' end end end Bar.new.hello #=> hello Bar.bye #=> good bye
つまり、特異クラスについては、イニシャライズ(new)しなくていい、そのままメソッドが使える
present?でnilでないかどうかの判定
参考サイト:http://techracho.bpsinc.jp/baba/2011_11_26/4724
なるべく、否定である!
は書かないようにとのこと
メソッドの最後に!や?をつけるのは???
そのメソッドが判定を行ったり、何かやっていない状態での動作などを表すため
ex.
ログインをして'いない'状態でログインを求めるメソッド名
def require_login!
パスワードが一致しているかどうかを判定して、ture or false を返したい場合
def correct_password?
インスタンス変数とローカル変数のスコープの違い
ローカル変数よりインスタンス変数の方がスコープの範囲が長い
参照サイト:http://docs.ruby-lang.org/ja/2.0.0/doc/spec=2fvariables.html
ローカル変数のスコープは、((宣言した位置から))その変数が宣 言されたブロック、メソッド定義、またはクラス/モジュール定義 の終りまでです。寿命もそのブロックの終りまで(トップレベルの ローカル変数はプログラムの終了まで)ですが、例外としてブロッ クが手続きオブジェクト化された場合は、そのオブジェクトが消滅 するまで存在します。同じスコープを参照する手続きオブジェクト 間ではローカル変数は共有されます。
いまさらながら、ruby の putsでつまずいた部分
puts
のについては、あらかじめ型の宣言がされていないのでstringとintegerは同居できないのでそのなかで型宣言(to_s)とかをやってあげないといけない
to_i.to_sで端数の切り捨てもできる
別クラスからメソッドを利用したいとき
クラス名.メソッド名(引数)
→引数はある場合のみ
※ただし、イニシャライズが必要な場合はイニシャライズしておくこと
ex.
class ClientUserLoginsController
SentMail.reset_password_to_mail(user)
end
superメソッドって?
クラスの継承を行った際に継承元と同じメソッド名の処理を引っ張ってこれるメソッドのこと
class Car def accele print("アクセルを踏みました¥n") end end
class Soarer < Car
def accele
super
print("加速しました¥n")
end
end
これで、Soarerクラスのacceleメソッドを実行するとCarクラスのacceleメソッドで定義している処理も実行できる
参考url: http://www.rubylife.jp/ini/inherit/index3.html
include?メソッドについて
include?メソッドはarrayクラスとstringクラスにはあるメソッドだが、integerにはないので、単一の数字を含んでいるかどうかの確認は == を用いて確認
parseとは?
jsonなどで取得した結果を見てみると分かるが、parseすることでkeyとvalueに分けてくれる
例えば、
member = Member.first.to_json
#=> "{\"id\":1,\"email\":\"reda.dsajpsa@gmail.com\",\"name\":\"ユーザー\",\"image_file_name\":null,\"image_content_type\":null,\"image_file_size\":null,\"image_updated_at\":null,\"kana\":null,\"password\":null,\"entry_year\":null,\"chatwork_id\":\"\",\"birthday\":null,\"indoor_call\":null,\"profile_message\":null,\"hobby\":null,\"job\":null,\"main_department_id\":null,\"created_at\":\"2015-08-05T14:13:35.000Z\",\"updated_at\":\"2015-08-08T07:49:06.000Z\",\"provider\":null,\"uid\":null,\"token\":null}"
この結果をparseすると
hash = JSON.parse(member)
#=>
{"id"=>1,
"email"=>"reda.dsajpsa@gmail.com",
"name"=>"ユーザー",
"image_file_name"=>nil,
"image_content_type"=>nil,
"image_file_size"=>nil,
"image_updated_at"=>nil,
"kana"=>nil,
"password"=>nil,
"entry_year"=>nil,
"chatwork_id"=>"",
"birthday"=>nil,
"indoor_call"=>nil,
"profile_message"=>nil,
"hobby"=>nil,
"job"=>nil,
"main_department_id"=>nil,
"created_at"=>"2015-08-05T14:13:35.000Z",
"updated_at"=>"2015-08-08T07:49:06.000Z",
"provider"=>nil,
"uid"=>nil,
"token"=>nil}
という形で直してくれる
文字列を用いてメソッドを呼び出したいとき
sendを使う
member.name
#=> 'sample'
member.send('name')
#=> 'sample'