There's an echo in my head

日々のメモ。

rails

Rails 5.x に更新する際に rails_kwargs_testing gem を使ったら便利だった

Rails 4.x で動いている社内ツールを Rails 5.x に更新する作業を最近やっていて、コントローラ・リクエスト周りのテストの書き換えに rails_kwargs_testing gem が便利だったのでメモ。 ざっくり書くと、これを使うと Rails 5.x 用のテストコードに寄せた状…

routes.rbでワイルドカードに引っ掛けたパスを別のサブドメインにリダイレクトする

http://aerial.st/archive/...に来たアクセスを一律にhttp://archive.aerial.st/archive/...にリダイレクトするようにした。 Rails.application.routes.draw do # (snip) get "archive/*path", to: redirect(subdomain: "archive", path: "/archive/%{path}"…

Railsのジェネレータを自作する

よく忘れるので。細かい話は他の記事にお任せして、テンプレートからファイルを作れるところまで。 0. こんなのを作りたいとかんがえる 抽象クラスFigureのサブクラスをapp/modelsに作るようなジェネレータがほしい。 クラス名は引数で指定したい こんな感じ…

polymorphic_pathを使って定型のリンクを手軽に作る

管理画面にTwitter Bootstrapを使ってボタンっぽいリンクを作っていると、 link_to t(:new), new_user_path, class: "btn btn-success" みたいなコードがビューにあふれてきてつらい。 なので、 new_link_to User としたら同じリンクを生成するようなヘルパ…

scaffoldするときのコントローラのテンプレートをカスタマイズする

[小ネタ]RailsのScaffoldテンプレートを上書きするススメの勝手に追補的な記事。 コントローラのテンプレートはrailties/lib/rails/generators/rails/scaffold_controller/templates/controller.rbあたりから#{Rails.root}/lib/templates/rails/scaffold_con…

素のオブジェクトをfields_forに使う

例えばモデル的にGraph has_many Entityだけど、GraphはActiveRecordを使う一方でEntityには素のオブジェクトを使いたい場合。データストアが異なるとか。 class Graph < ActiveRecord::Base after_save :save_entities def entities @entities ||= [] # TOD…

Rails 4.1ではモジュール配下のクラス名をunderscoeするときにacronymの設定を考慮してくれない

ActiveSupport::Inflector.underscore does not respect acronym inflections within a module · Issue #17193 · rails/rails · GitHub の件。 具体的な影響としてはたとえば次のように、SKUという単語をacronymとして設定しても、namespaceでモジュールを切…

capistrano-bundlerでデプロイしたときにbinstubがどうこうという警告が出る件の対応

bundlerでbinstubしたrailsコマンドやrakeコマンドを使っていると、次のような警告がbin/rails cしたときなどに表示される: Looks like your app's ./bin/rails is a stub that was generated by Bundler. In Rails 4, your app's bin/ directory contains …

Mavericksでrails-erdが動かない

OS X 10.9 Mavericksに上げてからrails-erdが動かなくなった。エラーも出さずにハングアップする。 対処方法はGitHubのissueに上がってた。一度dot形式で出力してから変換したところ動いた: rake erd filetype=dot dot -Tpdf erd.dot > erd.pdf Generation h…

accepts_nested_attributes_forを多段で使う

複数の関連を跨いでaccepts_nested_attributes_forを使う場合の話。 たとえば Organization has_many Groups Group has_many Employees というモデルに対して、1度にまとめてこれらのレコードを作成したい場合には次のようにする。 まずはクラスの定義: clas…

Rails.loggerのタグで使っているuuidを取得する方法

config.log_tagsで設定できるuuidの値は、ActionDispatch::Request#uuidもしくはレスポンスヘッダのX-Request-Idで取得できる。 この値はRackミドルウェアのActionDispatch::RequestIdで設定されているので、取得するならそれ以降のタイミングである必要があ…

form_forでprefixを指定する

ActionView::Helpers::FormBuilder#form_for(record, options = {}, &block)では:asオプションを指定することで各種フィールドのname属性に付けられるprefixを指定できる。 たとえば@person = Person.newに対して、デフォルトだと = form_for @person do |f|…

Railsでオフの状態のcheck_boxの値が送信される仕組み

ActionView::Helpers::FormBuilder#check_boxに書かれている内容。 checkboxのチェックがオフの状態だとブラウザはその値を送信しないため、そのままcheckboxがオフになったことをサーバに伝えることができない。 そこでRailsのcheck_boxメソッドは <input name="post[validated]" type="hidden" value="0" />

sorceryのcurrent_userにはご注意

2つコントローラで名前空間をわけてそれぞれでcurrent_userを使っている場合には要注意。 sorceryは ActionController::Baseでincludeされてる ログイン中のユーザはcurrent_userヘルパメソッドで呼び出す。このメソッド名の変更はできない ユーザのクラスで…

認証処理を行うsorceryを試してみた

deviseの主にルーティング周りがなんだかよくわからないので、sorceryを試してみた。ソースはgithubにあげたけど参考になるかは微妙。 sorceryはだいたい モデルで認証処理を行うメソッドを提供する 登録時にsalt値の生成とそれによるパスワードの暗号化 Use…

delayed_job + Rails4 + Capistrano + rbenv

Rails 4(ActiveRecord)でdelayed_jobを使いつつ、それをCapistranoでデプロイする方法のメモ。基本的に本家のWikiに従う。 キューの機能を使う まず必要なgemをインストールしてマイグレーションファイルと実行ファイルを作成する。 # Gemfile gem "delaye…

capistranoでassetsに更新がない場合にprecompileを行わない

サーバ間に差異があると意図どおりに動かない可能性があるのでおすすめできない(追記2参照) capistranoのでデプロイをするとdeploy:assets:precompileを走らせてassetsのコンパイルをしてくれるけど、毎回assetsに変更があるわけではない。なので変更がな…

capistrano_database_ymlでデプロイ時にdatabase.ymlを生成する

capistrano_database_ymlを使うと、デプロイ時にテンプレートからdatabase.ymlを生成することができる。このときcapistrano側からパラメータを与えられるので、multistageと組み合わせると「本番サーバとステージングサーバで同じproduction環境を使いながら…

RailsのルーティングでデフォルトのMIMEタイプを指定する

RailsアプリケーションにたとえばGET /fooってリクエストを投げると、ActionDispatchあたりでGET /foo.htmlとして解釈してコントローラに処理が渡る。GET /foo.jsonみたいに拡張子がついていれば補完されずに処理が渡る。 でもAPIサーバを作ってる時はデフォ…

RailsでRackミドルウェアを追加する

rakeタスクでつまれてるミドルウェアを確認する。 $ rake middleware use ActionDispatch::Static use Rack::Lock use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x007fed13d07bb0> use Rack::Runtime use Rack::MethodOverride use ActionDispatch::RequestId use Rails::Rack::Logger use ActionDispatch::ShowExcep</activesupport::cache::strategy::localcache::middleware:0x007fed13d07bb0>…

Railsアプリケーションにサブ機能を追加するchili

chiliはchankoのようなもの。 chankoは、大規模レガシープロダクトをレガシーコードのままベータ機能をサービス壊さずにぶっこむのに特化してるけど、ある程度ダーティさがある。chiliは、新規サービスにRails的な思想を守ったまま綺麗にベータ機能を追加す…

Ruby 2.0.0-preview1でRails 4(HEAD)を入れる

まずBundlerが1.2.2以上でないとエラーが出るので更新しておく。 $ gem install bundler $ rbenv rehash $ bundle -v Bundler version 1.2.2 RailsのHEADはGemfileでgitリポジトリを直接指定することでインストールできる。 $ mkdir edge_rails $ cd edge_ra…

has_one, has_many, belongs_toでconditionsを動的にする

Rails has_many with dynamic conditionsより、ActiveRecord 3.1+ではprocを使う必要があるみたい。3.2.8で確認済み。 class User has_many :pictures has_one :profile_picture, class_name: "Picture", foreign_key: "user_id", conditions: proc { ["id =…

ActiveRecord::Baseにfindとかfirstっぽいメソッドを生やす。

Rails 3.2.8の話。ActiveRecordは長いのでARと略す。 findやfirstの実装自体はAR::FinderMethodsで定義されていて、それをincludeすることでAR::Relationのインスタンス(user.postsとかUser.scopedの返り値)から使えるようになっている。 module AR::Finde…

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。