rails
Rails 4.x で動いている社内ツールを Rails 5.x に更新する作業を最近やっていて、コントローラ・リクエスト周りのテストの書き換えに rails_kwargs_testing gem が便利だったのでメモ。 ざっくり書くと、これを使うと Rails 5.x 用のテストコードに寄せた状…
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}"…
よく忘れるので。細かい話は他の記事にお任せして、テンプレートからファイルを作れるところまで。 0. こんなのを作りたいとかんがえる 抽象クラスFigureのサブクラスをapp/modelsに作るようなジェネレータがほしい。 クラス名は引数で指定したい こんな感じ…
管理画面にTwitter Bootstrapを使ってボタンっぽいリンクを作っていると、 link_to t(:new), new_user_path, class: "btn btn-success" みたいなコードがビューにあふれてきてつらい。 なので、 new_link_to User としたら同じリンクを生成するようなヘルパ…
[小ネタ]RailsのScaffoldテンプレートを上書きするススメの勝手に追補的な記事。 コントローラのテンプレートはrailties/lib/rails/generators/rails/scaffold_controller/templates/controller.rbあたりから#{Rails.root}/lib/templates/rails/scaffold_con…
例えばモデル的にGraph has_many Entityだけど、GraphはActiveRecordを使う一方でEntityには素のオブジェクトを使いたい場合。データストアが異なるとか。 class Graph < ActiveRecord::Base after_save :save_entities def entities @entities ||= [] # TOD…
ActiveSupport::Inflector.underscore does not respect acronym inflections within a module · Issue #17193 · rails/rails · GitHub の件。 具体的な影響としてはたとえば次のように、SKUという単語をacronymとして設定しても、namespaceでモジュールを切…
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 …
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を使う場合の話。 たとえば Organization has_many Groups Group has_many Employees というモデルに対して、1度にまとめてこれらのレコードを作成したい場合には次のようにする。 まずはクラスの定義: clas…
config.log_tagsで設定できるuuidの値は、ActionDispatch::Request#uuidもしくはレスポンスヘッダのX-Request-Idで取得できる。 この値はRackミドルウェアのActionDispatch::RequestIdで設定されているので、取得するならそれ以降のタイミングである必要があ…
ActionView::Helpers::FormBuilder#form_for(record, options = {}, &block)では:asオプションを指定することで各種フィールドのname属性に付けられるprefixを指定できる。 たとえば@person = Person.newに対して、デフォルトだと = form_for @person do |f|…
ActionView::Helpers::FormBuilder#check_boxに書かれている内容。 checkboxのチェックがオフの状態だとブラウザはその値を送信しないため、そのままcheckboxがオフになったことをサーバに伝えることができない。 そこでRailsのcheck_boxメソッドは <input name="post[validated]" type="hidden" value="0" />
2つコントローラで名前空間をわけてそれぞれでcurrent_userを使っている場合には要注意。 sorceryは ActionController::Baseでincludeされてる ログイン中のユーザはcurrent_userヘルパメソッドで呼び出す。このメソッド名の変更はできない ユーザのクラスで…
deviseの主にルーティング周りがなんだかよくわからないので、sorceryを試してみた。ソースはgithubにあげたけど参考になるかは微妙。 sorceryはだいたい モデルで認証処理を行うメソッドを提供する 登録時にsalt値の生成とそれによるパスワードの暗号化 Use…
Rails 4(ActiveRecord)でdelayed_jobを使いつつ、それをCapistranoでデプロイする方法のメモ。基本的に本家のWikiに従う。 キューの機能を使う まず必要なgemをインストールしてマイグレーションファイルと実行ファイルを作成する。 # Gemfile gem "delaye…
サーバ間に差異があると意図どおりに動かない可能性があるのでおすすめできない(追記2参照) capistranoのでデプロイをするとdeploy:assets:precompileを走らせてassetsのコンパイルをしてくれるけど、毎回assetsに変更があるわけではない。なので変更がな…
capistrano_database_ymlを使うと、デプロイ時にテンプレートからdatabase.ymlを生成することができる。このときcapistrano側からパラメータを与えられるので、multistageと組み合わせると「本番サーバとステージングサーバで同じproduction環境を使いながら…
RailsアプリケーションにたとえばGET /fooってリクエストを投げると、ActionDispatchあたりでGET /foo.htmlとして解釈してコントローラに処理が渡る。GET /foo.jsonみたいに拡張子がついていれば補完されずに処理が渡る。 でもAPIサーバを作ってる時はデフォ…
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>…
chiliはchankoのようなもの。 chankoは、大規模レガシープロダクトをレガシーコードのままベータ機能をサービス壊さずにぶっこむのに特化してるけど、ある程度ダーティさがある。chiliは、新規サービスにRails的な思想を守ったまま綺麗にベータ機能を追加す…
まず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…
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 =…
Rails 3.2.8の話。ActiveRecordは長いのでARと略す。 findやfirstの実装自体はAR::FinderMethodsで定義されていて、それをincludeすることでAR::Relationのインスタンス(user.postsとかUser.scopedの返り値)から使えるようになっている。 module AR::Finde…