読者です 読者をやめる 読者になる 読者になる

ruby

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…

配列指定のリファクタリング

片方が文字列で、展開式は配列をしている場合です。 同じ処理なのに、文字列を配列で処理が違うなんて・・・みたいな展開があった場合です。 文字列の処理を配列にすれば大丈夫です。 def hoge(hoge)←文字列 or 配列が入ってくる Array(hoge).each do |x| ..…

抽出系のメソッド

抽出系のメソッドです。 select 指定するものを抽出してくれます。 x = [1, 2, 3, 4, 5, 6, 7] x.select{|x| x == 2 } => [2] reject 指定するものを拒否して、削除してくれます。 x = [1, 2, 3, 4, 5, 6, 7] x.reject{|x| x == 2 } => [1, 3, 4, 5, 6, 7] …

rbenvをupdateして、最新のrubyを取得できるようにする

最新のrubyを取得するには、rbenvを使用しているのなら、ruby-buildが入っています。 こちらをupdateしないと、rubyの最新がインストールできなかったりします。 rbenvを使用しているのなら、rbenv updateで更新したいですよね。 GitHub - rkh/rbenv-update:…

可変長引数をhashする

可変長引数でhash化することができるオプションがあります。 def hash(**k) puts "#{k}" end hash(foo: 'bar', hoge: 'hoge') →{:foo=>"bar", :hoge=>"hoge"} 普通はhash(*k)とした場合は、ただの可変長引数でいくらでも引数が入力できるという状態になりま…

rubyでクラスの型を確認

継承元を含めているかどうかを確認します。 class Hoge end class Foo < Hoge end hoge = Hoge.new foo = Foo.new ===演算子 p Hoge === hoge → true p Foo === foo → true p Hoge === foo → true is_a? p hoge.is_a?(Hoge) → true p foo.is_a?(Foo) → true …

railsで条件つきvalidationをする方法

A, B, Cがあり、Aをしたら、B,Cがvalidationを行うという状況をしたかったです。 こんなことってありませんか? あまりないのかもしれない・・・ やり方 with_optionsを使えば特定の条件下で複数のvalidationをかけることができます。 個別で行いたい場合は…

railsのpresenceが便利という話

presenceという便利メソッドがあることを教えてもらったので、メモがてらに書いておきます。 使い方 まず、sourceコードです。 presence (Object) - APIdock def presence self if present? end present?であれば、selfを返すというシンプルメソッドですね。…

再帰関数について

社内勉強会で再帰関数という言葉が出たので、全く知らなかったので、調べました。 意味 関数の中で自分自身を呼び出すことです。 そのため、再帰関数と呼ばれているんですね。 サンプル 階乗計算が例にあったので、それを使います。 4 x 3 x 2 x 1こんなやつ…

演算子をオーバーライドする

コメントでいただいたので、調べてみました。 mikamisan.hatenablog.com rubyは演算子をオーバーライド(上書き)することができるようです。 対象となる演算子 | ^ & <=> == === =~ > >= < <= << >> + - * / % ** ~ +@ -@ [] []= ` ! != !~ 上記はメソッド…

要素代入(=)という書き方

gemとかでこういう書き方をたまに見かけます。 def hoge=(hoge) @hoge = hoge end メソッドに=つける意味あんのか?などと思っていました。 要素代入と呼ばれるものです。 参考 ztbuz.hateblo.jp 使い方 class User def name=(name) @name = name end def na…

rubyで多次元配列を作る

多次元配列の作り方がわからなかったのですが、こうすれば作成できます。 hash = Hash.new{ |h, k| h[k] = [] } => {} hash[:foobar] = { foo: :bar} => {:foo=>:bar} hash => {:foobar=>{:foo=>:bar}} hash[:foobar] => {:foo=>:bar} hash[:foobar][:foo] =…

in?とinclude?について

in?という、ActiveSupportのメソッドが使いやすいかもしれないと思ったので、書いておきます。 自分が今やっているプロジェクトで使われていたので、調べました。 結果は同じのinclude?と比較します。 include? まずは、include?からです。 x = [1, 2, 3] y …

rubyの配列の演算子

一発でわからない演算子があったので、備忘録をかねて書きます。 | 和集合 x = [1, 2, 3] y = [2, 3, 4] z = x | y ←重複を削除してくれます。 →=> [1, 2, 3, 4] - 差集合 x = [1, 2, 3] y = [2, 3, 4] z = x - y →=> [1] & 積集合 x = [1, 2, 3] y = [2, 3,…

"#{hoge}"で式展開できた

今日、コードレビューで指摘を受けて、教わりました。 いや、今まではずっと変数展開しか知らなかったので、感動しました。 できたんですね・・・ def self_introduction(name, pseudonym) puts "#{"#{pseudonym} is pseudonym ," if pseudonym} my name is …

rubyのtryが便利かもしれない

tryメソッドという、有効な手立てがあることがわかりました。 使い方 comment = Comment.last cooment.try(:body) →'hoge' ←存在していれば →nil ←存在しなければ 何が便利かというと、こういう形の場合に省略できるということです。 comment = Comment.last…

eachの戻り値について

eachの戻り値がわかってなかったので、備忘録で書いておきます。 fruits = %w(apple orange grape) def sample puts "hoge" puts yield puts "Hoge" end sample do fruits.each do |fruit| "I like #{fruit}" end end → hoge apple orange grape Hoge I like…

unlessで結合した論理式を重ねていかない方法

hoge unless ~ ここの~でよく追加して条件を埋めていました。 自分がやっている場合は、いいのですが、何が困ったかというと、自分で振り返ってみたら分からなくなってしまします。 ~でない限りという否定の条件なので、これが深くなっていくと、ぱっと見で…

gemのawesome_printでirbの表示形式を整形できる

irbを使用していると、オブジェクトが整形されて出力されません。 小さいデータならいいのですが、量がかさばってくると探すだけで正直しんどいです。 そんな時に便利なgemがawasome_printです。 github.com 使い方 インストール gem install awesome_print …

rubyのyieldについて

yieldはrailsで見かけますが、よく理解していなかったです。 ここでyieldについて説明します。 ブロックについて yieldについて話をする前に、ブロックの話をしないといけません。 そもそもブロックってなんですか?というところですね。 name_list = %w(ali…

klassの使い方

klassって意味がわかんないよーって状態だったので、調べました。 下記を参考にさせていただきました。 stackoverflow.com 定義 classは予約語なので、classが使えないときに使いましょうということでした。 サンプル def inspect_class(class) puts class.c…

update_attributes/update_columnsの違い

今日はupdate_attributes/update_columnsの違いについて説明します。 自分自身が違いを理解していなかったので、使い分けの理解ができていなかったです。 概要 下記の記事から引用させていただきます。 qiita.com メソッド 保存 バリデーション(*1) コールバ…

moduleの定数にアクセスする方法

moduleの定数にアクセスする必要があるとは思ってもいなかったです。 まさかこんな日が来るとは・・・ module Hoge class Hogehoge HOGE = "hoge" end end p Hoge::Hogehoge::HOGE → hoge module Hogee module Hogehogee HOGEEEE = "hogeeee" end end p Hoge…

rubyメソッドチェーンの作り方

今日はメソッドチェーンの作り方を教えてもらいました。 応用が利くことになると思うので、備忘録的に書いておきます。 メソッドチェーンとは メソッドチェーンとは、メソッドをつなげていくものです。 サンプルです 'hoGe'.downcase.upcase => 'HOGE' 作り…

rbenv-default-gemsが便利!

rbenv-default-gemsが超便利です。 rubocopを使用していて、rubyのversion変更していたらエラーが出たので、解決策を探していました。 エラー内容です。 Error: rbenv: rubocop: command not found The `rubocop' command exists in these Ruby versions: 2.…

rubyの可変長引数

メソッドの引数で*hogeが気になっていました。 *がついている引数を可変長変数といいます。 意味 コンピューターで,処理単位の長さを変えられるようにしたもの。ファイルを小さくできる。 可変長(かへんちょう)とは - コトバンク メソッドでは、処理単位の…

with_indexについて

便利メソッドの紹介です。 railsでユニークな値をつけたいときには、with_indexを使えば簡単に実現できます。 pepole = %w(Bob Tom Lazy) pepole.each.with_index do |name, index| p "#{index}:#{name}" => "0:Bob" "1:Tom" "2:Lazy" end each_with_indexで…