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

Rails

Wordpressの記事データをRailsのDBに移行する

目次 目次 おおざっぱな流れ 移行するデータ 1. CSVを抽出 記事データ カテゴリ タグ Primary Category 画像データ サムネイル 2. mysqlでimportする 記事データ カテゴリデータ 記事とカテゴリの関連付けデータ タグデータ 記事とタグの関連付けデータ Prim…

Googleのモバイルフレンドリーテストのデバイス判定が適切にされないとき

Googleのモバイルフレンドリーテストの際に、mobile用のViewが適切に読み込まれていないことに気付きました。これはページランクに影響が出る可能性大なので早急に解決すべき問題。 k0kubunさんのrack-user_agentを使って、RailsのAction Pack Variantsを用…

React x Railsでデータの同時編集ロック機能を実装する

検討 競合する可能性が大いにあり、かつデータの整合性が非常に重要な部分の実装なので、今回の場合は楽観的ロックではつらそう。では悲観的ロックではどうか。 悲観的ロックとは、 悲観的ロックとは、DBMSの行ロック機能(SELECT FOR UPDATE句)を利用して…

Reactでロード中indicatorを表示するcomponentをRailsに組み込む

react-spinkitを使ってみます。 github.com 以下にデモも用意してくれてます。 React Spinkit classnamesとobject-assignというライブラリを使用しているので、こちらをnpmでインストールしておくのを忘れないように。 GitHub - JedWatson/classnames: A sim…

Railsで標準クラスへメソッドを追加してNumericの桁数を求めれるようにする

Numericクラスに、桁数を返すメソッドを追加したいと思ったので、Railsに乗っていて標準クラスをオーバーライドするプラクティスあるのかなーと思って調べてみましたが、特に決まったものはなさそうです。 ruby on rails - Railsで既存クラスへのメソッド追…

impressionistでcounter_cacheがうまくupdateされない

PVの測定にimpressionistというgemを使っているのですが、このimpressionistにはRails3くらいに実装されたcounter_cacheの機能を簡単に盛り込めるようにしてくれるオプションをis_impressionableメソッドにつけてくれてます。 ですがこいつがうまくupdateさ…

Railsでログイン機能を自作する

はじめに deviseを使いたくないし、と思ったらsorceryは開発終了してしまってるみたいだし、monbanはきになるけどproductionに載せるには少し不安だ...。 ということで、僕がきいてる限りだと大きな会社のアプリケーションだとかなり自作の事例の方が多いみ…

【動的VS静的】Railsの404/500エラーページ 静的の勝利

揉めに揉める議論 最初、もりじゅんさんの以下の記事を参考にさせていただこうとしたのですが、 morizyun.github.io Qiitaでも(多分もりじゅんさんの記事を参考にした)同じ例をみかけて、そこでyuki24さんが、この方法はあまりよい方法でないというコメン…

Capistranoデプロイ時にwheneverのタスクでinvalid byte sequenceのエラー

Capistranoでのデプロイ時に、デプロイフックでのタスク中で以下のようなエラーが出るようになりました。 DEBUG [67444af4] Command: cd /var/www/onebox/releases/20160426053048 && ( export RBENV_ROOT="/usr/local/rbenv" RBENV_VERSION="2.3.0" ; /usr/…

Rails+Reactにbrowserifyを導入する

react-railsでReactを導入してるRailsアプリにbrowserifyを導入します! JSのモダンな環境に関してはめちゃくちゃ素人なので調べた過程で読んでよかった!な記事を順番になるようにメモしておきます。 最初に読みたい記事 最初に読んでおいたらいいなと思っ…

Webpay::Mockで決済周りのテストを書く

この記事 qiita.com とかを参考にしながらWebpayでの決済機能は実現できたものの、テスト書くのどうしよ。。 と悩んでいたところでWebpay::Mockというものを用意してくださってくれていることに気付く。 決済周りの処理のテストを書く方法をメモしておきます…

全アクション共通メソッドを利用してナビゲーションバーに検索フォームを配置する

検索フォームをナビゲーションバーのような共通viewファイルに置くにはどうしたらいいのか、一瞬迷ったのでメモ。 今回は、以下で作成した検索フォームをnavigation barに配置したいと思います。 totutotu.hatenablog.com 実装 Railsでは、全てのController…

Railsで検索機能を実装する

Special Thanks 以下の2つを参考にして実装しました。 github.com ruby-rails.hatenadiary.com 実装 Railsで、ransackを使ってObjectベースな検索機能を作成していきます。 今作成してるCofwaというコーヒーコミュニティアプリケーションで、豆のブランドの…

URLのパラメータにid以外を使う方法

/users/:idではなく/users/:usernameみたいにURLにid以外のパラメータの値を使う方法です。 以下でいけます。 resources :users, param: :username パラメータにするカラムはunique設定されてることを一応確認しておきましょう。 基本的にidはアプリケーショ…

deviseに疲れたのでsorceryでユーザログイン機能を実装

deviseの代替案として、前々からsoceryいいよなんてきいてたので使ってみます。 github.com @komagata さんにおききしたらつらみはそんなに減らないとなったのが一瞬頭によぎる @komagata devise、つらみを感じてます...。あとはSorceryとかをよくきくのです…

Railsでのテスト時に`test_after_commit`のgemが読み込めないエラー

こんな感じのエラーに出くわした。 /Users/totzyuta/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/bundler-1.11.2/lib/bundler/runtime.rb:80:in `rescue in block (2 levels) in require': There was an error while trying to load the gem 'test_afte…

Twilio+Deviseで電話番号(SMS)ユーザログイン機能を実装

電話番号認証、サービスによってはすごい比率が高いらしいので実装したいなと思います。 目次 目次 方針の検討 1. 電話からの音声案内 2. 情報をアプリケーション側で開示した後、ユーザがSMSを送信 3. アプリケーション側から6桁の番号を送信、ユーザはそれ…

deviseでemailの確認を行わずにuserを保存する

deviseでconfirmableを使ってemailのverificationを行うようにすると、SNSログインを使ったユーザなりもともと登録されてたユーザなり全て送信されたメールの確認が必要になっていまいます。 そんなときの逃げ道。#skip_confirmation!を使えばよいようです。…

deviseで各種OAuthのSNSログイン実装 [Twitter,Facebook,Google,Yahoo!]

OAuthでの各種SNSログイン機能を、deviseを使ってるところに実装したので、それぞれ参考にした資料とかまとめておきます。 Twitter && Facebook deviseを使っていれば、以下の記事に従えば簡単に実装できます! qiita.com Twitterでレスポンスのデータサイズ…

Adminなlayoutを設定する

以下を参考に。 stackoverflow.com まずは、Adminで区切られる名前空間のコントローラーに共通する親コントローラを作成します。 class Admin::BaseController < ApplicationController layout 'admin' before_filter :require_admin_user end こうすること…

同一モデル間の中間テーブルを作成する

同一モデルを含む中間テーブルを作成して、そこでhas_oneやhas_manyしたい状況がありました。 以下がとても参考になりました。 has_many :through の関連に同一モデルを含む場合【rails4】 | Coma's Tech Blog HABTMでforeign_keyとかclass_nameを駆使してみ…

railsコマンドでundefined method `register_preprocessor' for nil:NilClass (NoMethodError)になる

長らくしてなかったプロジェクトでbundle updateしたら、bin/rails sなどのrailsコマンドが動かなかった。エラーメッセージは以下のような感じに。 /Users/totz/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/less-rails-2.7.0/lib/less/rails/railtie.rb…

Rails 5.0.0-beta1が出た && API mode使ってみた

今朝、ついに出てましたーー Rails 5.0.0.beta1: Action Cable, API mode, Rails command, https://t.co/Q1Q85ciiNM – It's out! "gem install rails -v 5.0.0.beta1" and party!— DHH (@dhh) 2015, 12月 18 ということで、Release Notesは以下に。 Riding R…

deviseとmobyletteでNo renderer defined for format: mobileになる

mobyletteのmobileとのviewファイルの切り替え方法が、MIME typeを変えるという非常にワイルドな方法なために、deviseでのrespond_with()で mobile なんてフォーマットのrendererねえよって言われてしまう。 これは、Railsのrenderを担当してるControllerに…

Rails4系でのActionCableの使い方

Rails4でリアルタイムなチャットアプリを実装しながら、ActionCableの基本的な使い方をみていきたいなと思います。 完成形こんな感じ。 作ったサンプルアプリは、以下に置いております。 github.com 以下の記事を参考にさせていただきました。 Rails 5's Act…

Railsに絵文字の画像を追加する

gemojiを使って絵文字を追加する方法です。 https://github.com/github/gemoji まずはgemをbundle # Gemfile gem "gemoji" $ bundle installしたら、Rakefileに以下を加えます。 load "tasks/emoji.rake" そしたらおもむろにrakeタスク実行 $ bin/rake emoji…

ActiveSupportのメソッドを素のRubyスクリプトで使う

今回は、ActiveSupportのyesterdayメソッドを例にやってみます。 ActiveSupportのyesterdayメソッドは、名前空間全部含めると、ActiveSupport::CoreExtensions::Date::Calculations.yesterdayでした。 https://github.com/rails/rails/blob/master/activesup…

RailsでPCとスマフォのViewを切り分ける

スタイルシートは分けてマニフェストを書いているのですが、Viewファイルをスマフォ用に分けるかどうかは多分誰しも一度は悩んだことがあると思います。 Viewファイルを一緒にするメリットは 保守が楽になる: 機能追加などによるPC、スマフォ両方のUIの変更…

Websocket-railsはどう動くのか

なんか仕組み的な ざっくりだと、「クライアント側のJavaScriptと、サーバーサイドのevent.rbがイベントを送受信しあう」って感じ。 まずWebsocketについて 以下を読めばだいたいわかります。他の抽象的な理論ばかりでなくHTTPのヘッダの内容からもWebsocket…

モデルクラスのインスタンスメソッドで属性を書き換えるにはselfがいる?

探る過程 ARモデル内で、その属性を更新しようとして以下のようなメソッドを書くとする。 # app/models/user.rb class User < ActiveRecord::Base # ... def toggle_roll status = status == "active" ? "inactive" : "active" save! end end Userモデルのイ…

ActiveRecord::Base#reloadの使い方

ARインスタンスをデータベースから再取得する。 例えば別のリクエストで発生したプロセスがDBのカラムを変更したときに、インスタンスにはもちろん反映されない。 変更されたRDBの内容をインスタンスに反映させるのがこのActiveRecord::Base#reloadというわ…

RailsでHTTPS通信

Railsで全ページのSSL通信を強制するには、configファイルで、 MyApp::Application.configure do # ... # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. config.force_ssl = true # ... end とすればいけ…

Railsの4.2.5 RC2を使う

つい先日(2015/11/06)、Railsの4.2.5のRC版が出ましたね。 http://weblog.rubyonrails.org/releases/ 大江戸Ruby会議で、Rails Guidesのコミッタ、Railsなどにコントリビュートされてる @spikeolaf さんに「RC版でたよね!使ってみてよ!」と言っていただい…

読んで理解するActiveRecordの設計とActiveSupport::Concern - メタプロRuby第二版

最近Fincでインターンをしている友人が社内勉強会をひらいているということで、そこに強引に参加させてもらってます(ありがとうございますありがとうございます) 今はメタプログラミングRubyを進めております。(この前2版が出たので急いで切り替えた!) 毎週…

HTML5を意識したView Helperを使おう

date_selectメソッドとかではダメで、date_fieldでないとtype="date"がついてくれないことに気づいた。 HTML5から、type="date"が追加されて、ブラウザによって対応は違うものの、このtypeを付随させることのメリットは大きい。 http://dev.classmethod.jp/r…

Railsでmaterializeを使う

bootstrapのdiv地獄から抜け出したいと思った僕たちは、materializeを使うことにしました。 http://materializecss.com/ bowerでinstallする例も見かけますが、fontで不具合が起こったなどの投稿もみかけたので、gemでいれちゃいます。 https://github.com/m…

FactoryGirlのcreate strategyを追ってみる

FactoryGirlで、associationメソッドのaliasでuserみたいにassociationのある関連データを生成できるようになった。 動的メソッド感がプンプンするので、知りたいと思ったのでこれを追ってみることにする。 まずはrunnerのrunメソッドから。ここから全てが始…

FactoryGirlで関連データをtrait付きで生成する

ここのissueで議論されていました。 https://github.com/thoughtbot/factory_girl/issues/263 このコミット。 例えば、user has_one ownerなOwnerを作成するとして、spec/factories/users.rbがこんな感じとすると。 FactoryGirl.define do factory :user do …

kaminariを使ってページネーションを実装

@a_matsuda さんの作られた、kaminariを使ってページネーションを実現しようと思います。 自分で実装しようと思うと結構めんどくさいのですが、kaminari使うと一発でできちゃいます。すごすぎです。 まずはGemfileに追加してbundle installします。 gem 'kam…

Capybara+webkitでのJSのテストでのmysqlデッドロックエラー

featureテストで、WebpayのCheckoutHelperをなかなかCapybaraでテストできなかったのでメモ。 Rails integration tests, RSpec, Capybara, and MySQL deadlocks ということでmysqlでdeadlockが起こってしまってたみたい。 以下の記事で解決した。 Rails inte…

ActiveAdminのアセットが影響しないように切り離す

ActiveAdminを使っていると、アセットの汚染が起こるときがあるみたいですね。 ということでActiveAdminのアセットが、admin以外のページのマニフェストでは読み込まれないようにしておきます。 以下の記事を参考にさせていただきました。 ActiveAdminを使用…

DeviseでFacebookのAOuth認証を導入する

Special Thanks OmniAuth: Overview - devise wiki https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview Devise+OmniAuthでユーザ認証を実装する手順 http://qiita.com/kami30k/items/94aec2d94a2b4e9a1d0b 手順 0. さいしょに 最初に、 Remem…

【RSpec】なんかテストでAssociationが反映されなくて困った

モデル間のassociationを変更した時に、エラーが出た。 モデルファイルに記述する関係性も大丈夫だし、属性の名前も変更した。 じゃあとはなんだ...? と思って $ bin/rake db:reset:migrate とかj $ bin/rake db:drop $ bin/rake db:setup とか試してたんだ…

Rails Dev Box on CentOS

AWSのEC2を動かす予定なので、CentOSでかつ、Rubyのバージョン管理ツールはrbenvなRails Dev Boxがほしいと思い。 totzyuta/rails-dev-box-centos · GitHub そのままのスクリプトの環境は下のような感じです。 Ruby: 2.3 Rails ~>4.2 DB: MySQL CentOS 64 KV…

shared_examplesで冗長なテストファイルをすっきりすまーと

RSpecで、おんなじようなexamplesがたくさん出てきたときに、shared_exampleでまとめてしまって簡単にしたのでソースコードのdiffをメモっとく。 summary テストする項目は、作成したメールのうち、 適切な題になっているか 適切な受信メールアドレスになっ…

【テスト編】ActionMailerでメールを送信する

せっかくなのでTDDで。 方針 Emailのテストに関しては以下の記事が非常に丁寧にまとめてくださっていて感謝感激です。 ActionMailer のメール送信テストを RSpec で行う | EasyRamble Emailのテストを書き始める前にRails Guidesのテストの項目に目を通して…

【RSpec】ActionMailer+ActiveJobのテストを書く

メール送信機能は処理時間が長いので遅延処理にしてる場合が多いと思うのですが、遅延処理のテストってどうやって書くねん!って思って苦労したので書き留めておきます。フィーチャテスト(Integration test)のスペックを書く想定です。 めっちゃいろいろ方法…

seeds.rbの使い方とマスタデータの取り扱いついて考える

1. マスタデータの扱いについて rake db:seedするたびにデータが挿入される。 idをインクリメントで自動挿入するときにめんどくさいことになる。 最初に挿入するマスターデータにassociationを張っている場合は、何回も生成してidが更新されると致命的なので…

ActiveAdminで新しいレコードだけ特定formを表示する

ActiveAdminを使っていて、新しいレコード、またはすでに存在しているレコード別々のフォームを表示させたいときには、以下のようにそれが新しいレコードかどうか条件分岐すればok if !f.object.new_record? f.input :status, collection: %w(init ready), s…

Railsで簡単バルクインサート

SQLには複数のデータを以下のようにぼぼぼっと登録する機能があります。 INSERT INTO books (columns) VALUES (values), (values), (values); これはバルクインサートと呼ばれて、普通に3回違うデータをINSERTするよりパフォーマンスがよくなります。 場合に…