ruby

書誌情報を取得するAPI(openBD)のラッパーのgemを作成した

個人で読書管理サイトを作成しており、書誌の情報が欲しいと思い、利用できる場所を探していた時に出会いました。 openBD | 書誌情報・書影を自由に 調べたところ、goのライブラリはあったのですが、ruby用がなかったので作成しました。 isbnを送信するだけ…

Deviseでユーザー登録後のリダイレクト先を変更する

Deviseのカスタマイズに少し苦労しました。 大体標準通りに使えば問題ないのかもしれませんが、少し加工しようとするとちょっと調べないといけないですね。 今回行うことは、Deviseでユーザー登録後に、Thanksページに飛ばすことです。 リダイレクト自体は割…

CSVでファイルを保存するなら、jsonで保存する方が楽ということに気づいた

CSVでhashの値を保存する場合分解しないといけないじゃないですか? めんどくさいですよね。 例えばこういうデータです。 class FooApi HEADER = %w(foo bar baz) def export CSV.open('foo.csv', 'w:utf-8', headers: HEADERS, write_headers: true, force_…

正規表現で〜から〜までのパターン

こういうやつです。 宮藤官九郎(第1話、第2話、最終話)で名前と後ろを分けたい場合。 (?<name>.[^((]*)(?<supplement>.*)? 否定を間に挟んで、それ以外までにする。 これがミソ。 このパターン多いと思うし、覚えておこ。</supplement></name>

正規表現で名前付きキャプチャが便利だった

これがあれば何にマッチさせているかわかるじゃん!って感動しました。 正規表現でキャプチャするときに$1で変数格納されますが、この場合何にマッチさせているのかがわかりづらいときがあります。 何より量が増えてくるとしんどいです。 使い方 (?<name>正規表現</name>…

rubyでeach_with_indexでindexの値を0以外から始める方法

rubyでeach x indexをしたいパターンが多いです。 そのために、each_with_indexというメソッドがあります。 each_with_index こちらは基本的に初期値が0からになります。 array = %w(foo bar baz) array.each_with_index do |x, index| puts "#{index}番目#{…

rails5でautoload問題を解決する

やられましたよ。 rails4 → rails5へのアップデートをしていたのですが、libpathの配下のものが読まれない。 config/application.rb config.autoload_paths += %W(#{config.root}/lib) 問題ないだろ。 そう思っていましたよ。 どうやら、この作業が無効にな…

rubyでrakeの外部コマンドが失敗した時のエラーハンドリング

webpackerを使用していて、webpacker installって出ているのに、installは失敗していた。 これはムカつくからpullreq出してやろうと思ったら、すでにあった。 さすがだ。 fail hard when webpacker:install ./bin/yarn fails by sealocal · Pull Request #14…

es2015の分割代入は、rubyのキーワード引数のイメージ

わかりづれー!ってなっていました。 {}←これ何?って感じで意味不明に陥りやすかったです。 function foo({x, y}) { return x + y } console.log(foo({x: 1, y: 2})); =>3 x, yのvalueが代入されている。 これってrubyのキーワード引数と同じっぽく感じる。…

フックメソッドについて

特定のタイミングで実行されるものです。 意味不明だと思うので、解説します。 included includeではありません、includedです。 なんとなく、見覚えがあったのですが、違いを全く理解していませんでした。 includedメソッドは、includeメソッドによってモジ…

特異メソッドでincludeする方法

何個か方法あるので、少しづつ紹介します。 クラス内でincludeする module Foo def hello 'hello' end end class Bar class << self include Foo end end Bar.hello => "hello" 特定のオブジェクトだけincludeする x = Bar.new class << x include Foo end x…

クラス変数の注意点

クラス変数なんて、めったに使うことなんてないし、railsで使うならclass_attributeがあるんで、普通は必要ないです。 しかし、よくクラス変数やめろ!なんて言われることが多いと思うので、ここでおさらいしておきます。 クラス変数とは そもそもクラス変数…

クラスメソッドをprivateメソッドにする方法

単純にprivateにするだけはダメです。 class Foo def self.bar puts 'bar' end private def self.baz puts 'baz' end end Foo.baz =>baz という風に実は普通に呼べています。 方法は二種類あります。 self内でprivateを呼ぶ private_class_methodを定義する …

capybaraのrpsec実行時にブラウザを切り替えるgemを作成しました

普段はwebkitで十分なのですが、たまにchromeで開きたいって時ありますよね? そんなgemを作成しました。 GitHub - ryosuke-endo/capybara_switch_driver 中身は微妙かもしれないけど、自分で使う分だからいいのかなと思いました。 以上です。

javascriptとrubyのクロージャーについて

クロージャーは「ローカル変数を参照する関数」です。 このいいところは、変数を一時保存できるところだと思ってます。 function closure() { let x = 0; return function(){ return ++x; } } c = closure() c() =>1 c() =>2 何回押したとか、初回だけとかの…

respond_to?でメソッドがあるかを確認する

タイトルの通りです。 respond_toの書き方 class Foo def foo p 'foo' end private def private_foo p 'private foo' end end x = Foo.new x.respond_to?(:foo) => true x.respond_to?(:foo, true) => true x.respond_to?(:private_foo) => false x.respond_…

返ってくる値を真偽値に変換する

例えば、matchを使用して、正しいかどうかの確認だけをしたいと思います。 REG_EXP = /foo/ x = 'foo' x.match(REG_EXP) => #<MatchData "foo"> x.match('bar') => nil 通常だと判定した結果が返ってきます。 これを真偽値に変換します。 !!(x.match(REG_EXP)) => true !!(x.m</matchdata>…

rspecでprivate methodを呼び出したい時の方法

privateメソッドを実行したいけど、できないよ!って場合の方法です。 sendを使えばできます。 class Foo private def foo puts 'hoge' end end x = Foo.new x.send(:foo) hoge => nil x.foo NoMethodError: private method `foo' called for #<Foo:0x007fa279135010> こうなるので</foo:0x007fa279135010>…

オブジェクトのインスタンス変数名とメソッド一覧の取得方法

タイトルの通りです。 オブジェクトのインスタンス変数名とメソッド一覧の取得方法を探っていきます。 まずはインスタンス変数名からです。 インスタンス変数名の取得方法 instance_variables class Foo def initialize @foo = 1 @bar = 2 end end x = Foo.n…

rubyのthreadについて

スレッドは同じプロセス上でメモリを共有しつつ、処理を並列に実行することができます。 スレッドを用いることで、単独で時間がかかる処理を早くすることができる可能性があります。 スレッドの生成 スレッドを作成し、処理を実行するには、Thread.fork/Thre…

eval族

evalについてです。 |メソッド名|動作| |Kernel.#eval|selfが呼び出された式を評価する| |Module#class_eval|レシーバのクラスをselfとして式を評価する| |Module#module_eval|レシーバのモジュールをselfとして式を評価する| |Basic#Object#instace_eval|レ…

includeとprependで読み込む順番の確認

includeとprependで読み込む順番を確認していきたい思います。 moduleの複数読み込みをした場合に、どのような順番で読み込まれるのかを確認していきます。 includeの順番に依存 何も考えないでincludeしていく場合は、読み込む順番に依存していることがわか…

lambdaについて

lambaはProcオブジェクトの別の書き方です。 Procオブジェクトやブロックに関してはこちらの記事をみてください。 ブロックについて - mikami's engineer diary x = lambda { 'foo' } x.call =>foo lambdaは->でも書けるので上はこのように書き直せます。 x …

クラスメソッドについて

クラスメソッドの定義を見ていきます。 class Hoge def self.hello puts 'hoge' end end Hoge.hello =>hoge これは標準的な書き方だと思います。 この時のselfはクラス自身(ここではHoge)を見ています。 class Hoge def Hoge.hello puts 'hoge' end end Hoge…

classを動的に作成する

こんなやり方をすると可読性がなくて、よくないと思うのですが、紹介します。 klass = nil FooClass = Class.new do |f|←ブロック内で定義する klass = f f == self def hello puts 'hello' end end←ここで定義終了 => FooClass x = klass.new => #<FooClass:0x007ff5330a89c8> x.hello </fooclass:0x007ff5330a89c8>…

moduleについて

moduleについてなんとなーくでやっていたので、まとめます。 classとの違い インスタンスを生成することはできない 継承することはできない 用途 名前空間を作る モジュールのメソッドを、あるクラスのインスタンスメソッドとして取り込む モジュールのメソ…

特異メソッド

特異メソッドは、特定のオブジェクト固有のメソッドを作成することができます。 class Japanese def hello(name) puts "#{name} こんにちは" end end foo = Japanese.new foo.hello("foo") =>foo こんにちは bar = Japanese.new bar.hello("bar") => bar こ…

ブロックについて

今までブロックについて意識することができていませんでした。 do..endもしくは{}の範囲内って認識でした。 備忘録的として書いておきます。 ブロックとは 上で説明しているようにdo..endもしくは{}の範囲内がブロックです。 languages = %w(Html PHP Ruby) …

メソッドのオーバーライド

親クラスから小クラスへと継承した際に、元のメソッドをオーバーライドすると、くさいコードが消えました。 そこで、オーバーライドについて調べました。 例 例えば、下記のようなクラスがあったとします。 class Japanese def hello puts 'こんにちは' end …

tryを2回使うなら、mapで繋げてみる

最近はコードを短くことにはまってます。 リファクタリング好きな人の気持ちがわかりました。 今回はtryを2回使うパターンですね。 そんなのあるか?って思いますが、ありました! 特定の子モデルのテキスト内容の長さを比較する場合などです。 user.blogs.b…