49hack

見習いエンジニアが魔法使いになるまで

ruby

URLからクエリ文字列(GETパラメータ)を抽出してハッシュにする

環境 $ rails -v Rails 4.1.1 $ ruby -v ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin14.0] 方法 例えば、URLからクエリ文字列を抽出する場合はURIを使えば簡単。 uri_str = 'http://sample.com/path/to/hoge?a=1&b=2' uri = URI.parse(uri_st…

絵文字が含まれているかどうかチェックする

本当はmysql側のエンコーディング変更すべきですが、アプリケーション側の応急処置として。 class Post < ActiveRecord::Base validate :no_emoji # 本文に絵文字を使わないように def no_emoji if self.content.present? emoji_chars = self.content.each_c…

テキスト中にあるURLを抽出し、リンク(aタグ)に変換する

テキスト中にあるリンクがある場合は、ちゃんとクリックできるリンクにして出力したい! ということで、いろいろ調べてみました。 URLを抽出する textからURLを抽出するだけであれば、URI.extractを使えばOKです。 text = 'aaaaa http://xxx.com bbbbb http:…

twilio-rubyでSMSを送信する

SMS送信にtwilioを使ってみたのでメモがてらざっとまとめていきます。 はじめに twilioからgemが提供されてるのでインストールします。 gem 'twilio-ruby', '~> 4.2.1' twilioでSMS送信する場合は、SMS対応している国の電話番号を購入する必要があります。 …

with_optionsを使う際の注意点

環境 Railsのバージョンは4.1です。 $ rails -v Rails 4.1.1 そもそもwith_optionsって? オプションの記述が冗長にならないようにまとめてくれる便利メソッドです。 class User < ActiveRecord::Base validate :name, presence: true, if: :hoge validate :…

emailのバリデーションをちょっとだけ工夫する

Userモデルのemailに、存在チェックとフォーマットチェックを入れることを考えます。 必要なgemをインストールしておきます。 # Gemfile gem 'validates_email_format_of' 普通にやってみる class User < ActiveRecord::Base validates :email, presence: tr…

mysqlで同一単語を複数カラムにわたって検索する

CONCAT関数を使います。 例えばcolA, colBの2つのカラムでaaaを検索したい場合、 SELECT * FROM hoge_table where CONCAT(colA, colB) = "aaa" となります。 ただ、colA, colBのいずれかがNULLの場合、CONCATの結果もNULLになってしまうのでIFNULLで回避し…

指定した順序どおりにレコードを取得する

作業環境 使用しているRailsは4.1.1です。 $ rails -v Rails 4.1.1 一番手っ取り早い方法 例えば、ユーザを指定のid順に取得したい場合は、 # 普通にid渡してもできない user_ids = [4,2,3,1] users = User.where(id: user_ids) #=> [1,2,3,4] # MysqlのORED…

group_by のときに使う &:hogehoge ってなに?

User.all.group_by(&:age) レコードをグルーピングするときgroup_byを使いますが、引数の&(アンパサンド、アンド)の挙動をいまいち理解してなかったので調べてみました。 Rubyではメソッド呼び出しの引数に「&手続きオブジェクト」を渡すと、手続きオブジ…

railsを起動しようとしたらlibmysqlclient.18.dylib (LoadError)っていわれた

railsサーバを起動しようとしたらmysqlまわりのエラーが出て起動できず。。 $ rails s /Library/Ruby/Gems/2.0.0/gems/mysql2-0.3.16/lib/mysql2.rb:8:in `require': dlopen(/Library/Ruby/Gems/2.0.0/gems/mysql2-0.3.16/lib/mysql2/mysql2.bundle, 9): Lib…

大量のデータ挿入・更新にバルクインサート・バックアップデートを利用する

例えば以下の場合にSQLが1000回発行されます。 1000.times do Hoge.create(...) end # INSERT INTO hoge (...) # INSERT INTO hoge (...) # INSERT INTO hoge (...) # ... かなり非効率なのでbulk insertでSQLを1つにまとめて軽量化します。 Railsでbulk in…

引数を使えるrakeタスクを作成して実行するとzshに怒られた

環境 $ rails -v Rails 4.1.1 $ ruby -v ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin14.0] $ echo $SHELL /bin/zsh タスクを作成 my_taskを作成してみます。 rails g task my_task # lib/task/my_task.rake namespace :my_task do desc "おれ…

ckeditorに認証機能を実装する

ckeditorはデフォルトだと誰でもアクセス可能となっているので認証機能を追加します。 cancanを利用する場合は Ckeditor.setup do |config| config.authorize_with :cancan end でOKですが、独自の認証機能を使いたい場合は以下のようにします。 # config/in…

ckeditor+carrierwaveで画像をS3にアップロードできるようにする

WYSIWYGといえばckeditor!ということで、ckeditorのインストールから画像のS3アップロードの設定までを書いていきます。 必要なgemをインストール Gemfileに以下を追加し、bundleでインストールします。 # Gemfile gem 'carrierwave',github: 'carrierwaveu…

ckeditorのスタイルが本番環境で崩れる

Railsでよくある「開発環境では動くのに本番環境ではうまくいかない」パターン。 ckeditorが本番環境ではcssが 404 not found になってました。 以下の3行を加えてckeditorのアセットも一緒にプリコンパイルしてやればOKです。 # config/enviroments/product…

rubyで unused variable と言われないように使わない変数にはアンダースコア(_)を使う

例えば、以下のように使わない変数が宣言されている場合警告が出ます。 array = [[1,2],[4,3],[2,1]] array.sort{|(k1, v1), (k2, v2)| v2 <=> v1} # 「assigned but unused variable - k1」と警告が出ます。 このように使わない変数にはアンダースコア_を使…

配列から重複した要素を取り除くのではなく取り出す

ただ単に重複した要素を取り除く場合は、uniqを使えばOKです。 a = [1,2,3,5,1,2,4] a.uniq => [1, 2, 3, 4, 5] 今回は、重複した要素そのものを取り出したい、つまり、先ほどの配列aから[1,2]を抽出します。 a = [1,2,3,5,1,2,4] a.uniq.map { | e | [e, a.…

Carrierwaveでアップロードした画像が回転して表示されてしまう問題を解決する

結構ハマりました。 画像アップロードの構成としては、 CarrierwaveでS3にアップロード nginxでS3にリバースプロキシ small_lightで指定サイズにリサイズして表示 という流れをとっています。 アップロードした画像をS3から確認してみると正しい向きで表示さ…

Carrierwaveで画像をリサイズする

RMagickを使って画像のリサイズを行います。 今回はサムネイル表示用にバージョンthumbもつくってみます。 gemのインストール # Gemfile gem 'carrierwave' gem 'rmagick' # 今回のリサイズ処理に必要 リサイズ処理を記述 # app/uploaders/image_uploader.rb…

carrierwaveを使ってS3に画像をアップロードする

画像のアップロードにcarrierwaveを使ってみたのでメモがてらまとめます。 ほかにも、比較的実装が容易なpaperclipやcarrierwaveの後継であるrefileも使ってみましたが、保存先のディレクトリ指定、ファイル名変更、確認画面作成などの要件が満たせなかった…

メソッドの引数にアスタリスクをつけると形式を指定できる

rubyのgemをいろいろ試している時に見つけたのでメモ。 methodで引数にアスタリスクを使うといい感じに値を取得することができます。 アスタリスク1つ*だと配列、アスタリスク2つ**だとハッシュを指定できます。 def foo(a, *b, **c) [a, b, c] end こうす…

link_toにconfirmメッセージを追加する

キャンセルやリセットの処理をするリンクにはconfirmを追加したい! Rails4では以下のようにヘルパーで実現できます。 link_to 'キャンセル', "/hoge/fuga", :data => {:confirm => 'キャンセルしてもいい?'} 参考 How to add confirm message with link_to…

railsで使えるメソッドとかハマったところとか

ちょっとたまってきたのでメモがてらまとめます。 1. Hashを逆順にする あるハッシュ h = { "1" => "a", "2" => "c", "3" => "y", "4" => "x" } を逆順の { "4" => "x", "3" => "y", "2" => "c", "1" => "a" } にしたい場合、Arrayのreverseが使えます。 rev…

omniauthでfacebook, google+のSNS連携を実装する

作業環境 $ ruby --version ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin14.0] $ rails --version Rails 4.1.1 実装手順 必要なgemのインストール まずはomniauthをgemでインストールします。 gem 'omniauth' gem 'omniauth-facebook' gem 'om…

rails4のenumはupdate_allで使うときは注意が必要

Rails4.1.0から使えるようになったenumがめちゃめちゃ便利です。 例えばUserモデルにstatusというINTのカラムがある場合、enumを使うと直感的に管理できるようになります。 class User < ActiveRecord::Base # ステータス: temporary (仮登録), active (本登…

【随時更新】ActiveAdminのカスタマイズあれこれ

ActiveAdminをいろいろカスタマイズしてるのでそのメモです。随時更新しています〜。 セルに表示するコンテンツを増やす セルにはもともとデータが1つしか表示されませんが、+で増やすことができます。 ActiveAdmin.register Post do ... index do column :…

メールのテスト用にmailcatcherを導入する

テストメール用にmailcatcherを導入しました。command not foundと言われてちょっと焦る。。。rbenvを使ってる場合はrbenv rehashが必要です。 $ gem install mailcatcher $ mailcatcher zsh: command not found: mailcatcher $ rbenv rehash $ mailcatcher …

フォームのsubmitで確認ダイアログを表示する

知らない間に:confirmオプションは非推奨となり、dataで記述するようになってました。 <%= form_for(@task) fo |f| %> <div class="field"> <%= f.text_field :content %> </div> <div class="actions"> <%= f.submit "変更", data: { confirm: "ほんまに変更するで?"} %> </div> <% end %> それにしても:confirm…

HTMLEntitiesで特殊文字をencode/decodeする

HTMLEntitiesを使ってエンコード/デコードします。 gem 'htmlentities' HTMLEntities.new.encode("エンコードしたいやつ😃") HTMLEntities.new.decode("デコードしたいやつ&#9825;") 参考 How do I encode/decode HTML entities in Ruby? - Stack Overflow

配列の配列をHashに変換する

pluckで要素を2つ選ぶと配列の配列が生成されますが、このままだとちょっと扱いにくいのでHashにします。 a = User.order(:user_id).pluck(:user_id, :name) -> [[1, "taro"], [2, "jiro"], ...] 今回、user_idがユニークなのは保証されているので以下でOK…

date_selectで生成されるnameを変更する

select_dateでは受け取るパラメータを変更したい場合は、nameを変更する必要があります。 今回はgsubを使ってゴリゴリ置換で解決します(他にもっといい方法があるかもしれない)。 通常パターン select_date(Date.new) <select name="date_year" id="date[year]"> <select name="date_month" id="date[month]"> <select name="date_day" id="date[day]"> gsubを使って修正するパターン dat</select></select></select>…

KaminariでページングのURLにカスタムパラメータを追加する

Kaminariでページングを行う際、他のパラメータも追加したい場合はparamsオプションにハッシュを渡してあげればOKです。 基本的に現在のページのパラメータを引き継ぎたいことが多いのでこんな感じ。 <%= link_to_next_page @objects, "次ページへ", params:…

ユーザエージェントからiOSのバージョンを取得する

iOSのバージョンによってサーバ側で処理を分けたい場合、ユーザエージェントからバージョンを検出して対応します。 def check_ios_version # ユーザエージェントを取得 ua = request.env['HTTP_USER_AGENT'] ua =~ /iPhone OS (\d+)[\.|_]+(\d+)/ if $1 && $…

「`require': cannot load such file -- readline (LoadError)」のエラーを解消する

動作環境 $ cat /etc/`ls /etc -F | grep "release$\|version$"` CentOS release 6.4 (Final) $ rails -v Rails 4.0.0 $ ruby -v ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-linux] 事象 rails consoleコマンドを打つと以下のようなエラーが出まし…

EC2でRuby on Rails+Passenger+Apache環境を構築する

EC2にてRailsアプリケーションを作成し、ページを表示させるまでをまとめます。 EC2のインスタンス作成についてはこちらが参考になります。 Rubyのインストール確認 # ruby -v ruby 1.8.7 (2012-10-12 patchlevel 371) [x86_64-linux] rubyはデフォルトで入…

Rubyでメソッド一覧を確認するmethodsメソッドが便利

例えば、destroy!メソッドってあったっけ?みたいな場合など、 rubyでメソッド一覧を調べたいときにはmethodsメソッドを使います。 sortやgrepと組み合わせるとなお良しです。 使用出来るメソッド一覧を表示する @bbs = Bbs.new pp @bbs.methods -----------…

rubyの「undefined method `+@’ for ” “:String」を解決する

rubyでは+の位置によって挙動が変わるので注意が必要です。 str = "hoge" + "fuga" を改行する場合、 str = "hoge" + "fuga" # エラー:undefined method `+@’ for ” “:String これではエラ−となってしまいます。 +を文末に移動させて、 str = "hoge" + "fug…

「`join’: incompatible character encodings: ASCII-8BIT and UTF-8 (Encoding::CompatibilityError)」を解決する

コマンドライン引数で日本語を渡して文字列処理をしようとしたら 「内部と外部エンコーディングが異なるからjoinできないよ」と言われました。 $ ruby test.rb "てすとだよ" test.rb:39:in `join': incompatible character encodings: ASCII-8BIT and UTF-8 …