render_to_string の罠

rails 4.1.4

render_to_string(:index, layout: false) # => "文字列"

コンソールでの評価結果やメソッドの名前からは String が返ってくるように見える

でも実際は ActiveSupport::SafeBuffer が返ってくる

render_to_string(:index, layout: false).class # => ActiveSupport::SafeBuffer

さらに to_s で String にならない

render_to_string(:index, layout: false).to_s.class # => ActiveSupport::SafeBuffer

String を得るにはこうする必要があった

render_to_string(:index, layout: false).to_str

ツイートの内容を View に書いておいて Rubytter でツイートしようとしてハマった

text = render_to_string(:index, layout: false)
rubytter.update(text)

# NoMethodError: undefined method `each_byte' for nil:NilClass
# from /usr/local/rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/uri/common.rb:307:in `block in escape'