Hatena::ブログ(Diary)

milk1000cc このページをアンテナに追加 RSSフィード

about
 

2012-02-03

URI のクエリを書き換える

Addressable::URI を使うと、割ときれいに書ける気がします。忘れるのでメモ。

require 'addressable/uri'

uri = Addressable::URI.parse('http://example.com').normalize

uri.query_values = (uri.query_values or {}).merge('a' => '2')
uri.to_s  # => "http://example.com/?a=2"

uri.query_values = (uri.query_values or {}).merge('b' => '3')
uri.to_s  # => "http://example.com/?a=2&b=3"

2011-12-22

全角空白も含めた strip

"    全 半 \n  混  在 ".gsub(/(\A(\s|\u3000)+)|((\s|\u3000)+\Z)/, '')  # => "全 半 \n  混  在"

参考

Ruby【全角空白も除去】できるstrip!()ありますか? s = "  全.. - 人力検索はてな

解答例だと、途中に改行が含まれている場合の挙動が意図したものと違う

2011-12-13

ActiveDecorator で、強制的にヘルパーのメソッドを呼び出す

ActiveDecorator (v0.1.0) では、モデルのメソッド名とヘルパーのメソッド名が衝突した場合、モデルのメソッドが呼ばれるようです。

強制的にヘルパーのメソッドを呼び出したいときは、以下のようにすれば可能でした。

module HogeDecorator
  def my_truncate
    helper = ActiveDecorator::Helpers::DecoratorViewProxy.new
    helper.truncate description, length: 20
  end
end

2011-11-18

特定のプラットフォームに依存した gem を bundler で管理する

Rails, Capistrano も使ってる前提です。


まず Gemfile に、プラットフォーム別のグループを作ります。

darwin, linux というグループ名でなくてもいいですが、後述のことを考えるとこれが無難です。

group :darwin do
  gem 'mac 用 gem'
end

group :linux do
  gem 'linux 用 gem'
end

次に、config/appication.rb に以下を追加します。

if group = RUBY_PLATFORM[/(linux|darwin)/, 1]
  Bundler.require group
end

定数 RUBY_PLATFORM の結果を使って、読み込むグループを決めています。


最後に、config/deploy.rb で、デプロイ時に不要なグループを読み込まないようにします。

set :bundle_without, [:development, :test, :darwin]

(require 'bundler/capistrano' している前提です)


参考

bbatsov/rails-style-guide - GitHub

2011-11-17

RSpec 使用時 rails g model で、Factory Girl のファイルも作成する

rails (3.1.1)、rspec-rails (2.7.0)、factory_girl_rails (1.3.0) という環境です。


config/application.rb の config.generators に設定を書くだけです。

module Hoge
  class Application < Rails::Application
    ...

    config.generators do |g|
      g.fixture_replacement :factory_girl, dir: 'spec/factories'
    end
  end
end

% r g model Company name:string
      invoke  active_record
      create    db/migrate/20111117101239_create_companies.rb
      create    app/models/company.rb
      invoke    rspec
      create      spec/models/company_spec.rb
      invoke      factory_girl
      create        spec/factories/companies.rb

(alias r="bundle exec rails")


そのうち、これ書かなくても勝手にやってくれるようになりそうな気がしますが。

factory_girl_rails のソースをちょっと読んだら、勝手にやってくれそうな処理が書いてありましたが、私の環境では勝手にやってくれませんでした。。