$ brew update
$ brew upgrade rbenv ruby-build
$ CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl` --with-readline-dir=`brew --prefix readline`" rbenv install 2.1.2
$ rbenv global 2.1.2
$ gem install bundler rbenv-rehash
sinatraはset :foo, 'bar'
みたいなDSLを使って値を設定できる。でもこの値ってどこにどうやって保存されているんだろう?
普通、最終的にはインスタンス変数かクラス変数に格納されてるって思うよね。
(class << self; self; end).class_eval do
undef_method(name) if method_defined? name
String === content ? class_eval("def #{name}() #{content}; end") : define_method(name, &content)
end
sinatra/lib/sinatra/base.rb at v1.4.5 · sinatra/sinatra
ところがset :foo, 'bar'
するとbar
を返すfooというメソッドが定義されるという形で保存されている。
set
するたびにundef_method
して定義し直すので変数みたいに使えるようだ。静的な頭で考えてたのでクラクラするような格納方法だ。
$LOADED_FEATURESっていうのがある。
% pry
[1] pry(main)> $LOADED_FEATURES
=> ["enumerator.so",
"/usr/local/opt/rbenv/versions/2.1.0/lib/ruby/2.1.0/x86_64-darwin13.0/enc/encdb.bundle",
"/usr/local/opt/rbenv/versions/2.1.0/lib/ruby/2.1.0/x86_64-darwin13.0/enc/trans/transdb.bundle",
"/usr/local/opt/rbenv/versions/2.1.0/lib/ruby/2.1.0/x86_64-darwin13.0/rbconfig.rb",
"/usr/local/opt/rbenv/versions/2.1.0/lib/ruby/2.1.0/rubygems/compatibility.rb",
"/usr/local/opt/rbenv/versions/2.1.0/lib/ruby/2.1.0/rubygems/defaults.rb",
"/usr/local/opt/rbenv/versions/2.1.0/lib/ruby/2.1.0/rubygems/deprecate.rb",
"/usr/local/opt/rbenv/versions/2.1.0/lib/ruby/2.1.0/rubygems/errors.rb",
"/usr/local/opt/rbenv/versions/2.1.0/lib/ruby/2.1.0/rubygems/version.rb",
(snip)
ほうほう。
rubygems - How do I get a list of files that have been `required` in Ruby? - Stack Overflow
ActionMailerでマルチバイトのメールを送る時下記のように三行書く。
mail = NoticeMailer.charging(user, charge)
mail.transport_encoding = '8bit'
mail.deliver
プロジェクトの中にはNoticeMailer.posted_questionとかいくつかあるし、他のmethod
でも他のMailerクラス
でも一行で書きたいんだけどどのファイルにどう書くのがキレイかなあ?
追記:
tkawaさんのコメントを受けて実装された。

NoticeMailer.charging(user, charge).deliver

アプリの一部では使うからjbuildrのgem入れてるけど基本的にscaffoldでjson使いたくない場合。
# config/application.rb:
module Rails
class Application < Rails::Application
config.generators do |g|
g.jbuilder false
end
end
end
% brew update
% brew upgrade ruby-build
% CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl` --with-readline-dir=`brew --prefix readline`" rbenv install 2.1.0
% rbenv global 2.1.0
% gem install bundler rbenv-rehash
% rbenv rehash
バージョンのパッチレベル表記がシンプルになったのは気持ちいいですね。
元から入ってるrubyが最新版ですがsudoとかで壊すとやっかいなので。
% brew install readline openssl
% CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl` --with-gcc=clang" rbenv install 2.0.0-p247
% rbenv global 2.0.0-p247
% rbenv rehash
% gem install bundler rbenv-rehash
acts_as_listはitemに対するcategoryだとか、並び替えをグループ化する対象(scope)を指定できる。scopeをcategoryにすると同一category_idの中で並べ替えるといった具合。
シンプルにはそういうの要らなくて普通にitemを並べ替えたいだけだとおもうんだけどREADMEにのってる例がいきなりそういう応用編なので分かりづらいと思う。
configuration = { column: "position", scope: "1 = 1", top_of_list: 1, add_new_at: :bottom}
scopeに何も渡さなかった場合は"1 = 1"という文字列がSQLに渡されるので常にtrueだからそのシンプルな例が適応される。
active_decoratorは他の類似gemより気持ち良く書けて好きなんですが、時々
「decoratorのmethodが呼べないなあ?」
みたいな時があるのにもかかわらずなんとなく使ってて反省したのでコードを読んでみた。
要はview_assignsというその名の通りのrailsのmethodを使ってview_contextのinstance変数を列挙してActiveRecord系のものだったらdecorateすると。
なるほどなぁ〜。この辺が他の明示的にdecorateする系とは違うピリッと効いてるところなのかな。
それでやっとわかった。
= current_user.foo
とか
= @post.user.foo
とかいうようなassignしてない部分で「あれ、効かないな」となってたわけだ。
俺が使い方をわかってなかっただけなんですが、特に後者は結構でてくると思うけどみんなどうやってるんだろう?
追記:
と思ったらこのPRが正にそれっぽい。
Decorate associations of a decorated object by ronen · Pull Request #8 · amatsuda/active_decorator
association全部decorateするのはやり過ぎ感とかあるのかな?
railsでお決まりのliタグをシンプルに書くsexy_liというgemを作りました。
komagata/sexy_liBefore:
ul
- @posts.each do |post|
li
.id post.id
.title= post.title
After:
ul= render_li_for @posts
_post.html.slim:
.id= post.id
.title= post.title
という感じです。liに付くclassやid、partial名やlocal変数を決め打ちにしちゃおうというだけです。