LoginSignup
8

More than 5 years have passed since last update.

Railsを使っている際に知ったRuby備忘録

Last updated at Posted at 2015-07-01

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.

client_user_logins_controller.rb
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'

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8