Fishing

社内ブログに釣り記事書いたら、釣られた人がTwitterで凹んでた。
それみてこっちもちょっと凹んだ。すんません。

まぁ、それはそれとして、教科書に載せたいほど典型的な
「...は死んだ」メソッドのテンプレになったと思うので
こちらに記録。(またやる気満々)

以下のテンプレはクリエイティブ・コモンズで公開するので
よろしければみなさんで自由に改変してご利用ください。
意味が通じるように○○を適当に埋めれば釣り記事の出来上がり。

○○は死んだ

2007年6月1日16時30分現在、○○における○○は70%を割る。この一週間、50%を下回ることも少なくなかった。


そもそも○○の存在意義とはなんだろう。○○することだろうか。もちろんそういう面があることは否定しない。だが○○の強みはそういった○○ではなく、もっと○○ではなかったか。残念ながら○○が時として50%を下回るような状態ではこの強みを生かせるとは思えない。


取締役A氏は言う。
「○○」(ソース失念)
それが会社としての意見であるなら、○○の未来は暗いと言う他ない。


ただし、現時点で○○が瀕死の状態にあるとしても、これからの動き次第では復活の可能性も十分にある。性急な判断は控え、今後の経過を見守りたい。


参考サイト
http://akihitok.typepad.jp/blog/2007/04/post_5eca.html

ファイルアップロードのテスト

ActionController::TestUploadedFileと言うのが使えるみたい。
同僚に教えてもらいました。

def test_upload
  post :upload, {
    :file => ActionController::TestUploadedFile.new(
        "#{RAILS_ROOT}/public/images/test.png", 
        'image/png'),
  }, @session
  assert_response :success
  assert_not_nil Blob.find_by_filename_and_filetype('test.png', 'image/png')
end

ファイルアップロード

今まで何度となくファイルアップロードを書いては忘れ、その都度調べてて、いい加減疲れてきたのでここにメモる。今後はここをコピペする方向で。

基本的にこちらのコピーなので、要respond_to_parentプラグイン。説明もそちらを参照。ここには単にコードだけ置いときます。

できることは、画面遷移無しのファイルアップロードと、フォームの下に表示されているファイルリストの非同期な更新。

テーブルはこんな感じ

class CreateUploadedFiles < ActiveRecord::Migration 
  def self.up
    create_table :uploaded_files do |t|
      t.column :filename, :string
      t.column :content_type, :string
      t.column :size, :integer                      
      t.column :data, :binary                       
      t.column :created_at, :integer                
    end                                             
  end                                               
                                                    
  def self.down                                     
    drop_table :uploaded_files                      
  end                                               
end                                                 

ビュー
アップロードフォームを持つ静的な部分と、動的に更新されるファイルリストはテンプレートを分けておく

attach.rhtml

<iframe name="frame" style="width:0;height:0;border:0;"></iframe>                                                   
<% form_tag({:action => 'upload'}, 
            {:multipart => true, :target => 'frame'}) do -%> 
 <%= file_field_tag 'file' %>                                                                         
 <%= submit_tag _('Upload') %>                                                                        
<% end -%>                                                                                            
                                                                                                      
<div id='uploaded_file_list'>                                                                         
 <%= render :partial => 'uploaded_file_list' %>                                                       
</div>                                                                                                

_uploaded_file_list.rhtml

<% unless @uploaded_files.empty? -%>           
 <ul>                                                   
 <% @uploaded_files.each do |uploaded_file| -%>
  <li><%= uploaded_file.filename %></li>                
 <% end -%>                                             
 </ul>                                                  
<% else -%>                                             
 <%= _('No uploaded file exists.') %>                   
<% end -%>                                              

コントローラー

def attach
  @uploaded_files = UploadedFile.find :all
end

def upload
  file = params[:file]
  UploadedFile.create :filename => file.original_filename,
                      :content_type => file.content_type,
                      :size => file.length,
                      :data => file.read
  @uploaded_files = UploadedFile.find :all
  responds_to_parent do
    html = render_to_string :partial => 'uploaded_file_list'
    render :update do |page|
      page.replace_html 'uploaded_file_list', html
    end
  end
end

[追記]
画面遷移なしでファイルアップロードする方法 と Safariの注意点 (groundwalker.com) にかかれてあるとおりの現象がおきたので修正しました。

再帰

ファーストクラスオブジェクトとして宣言した関数は再帰的に呼び出せるんだろうか、と疑問に思ったので試してみた。

<html>
<head>
<script>
var myLoop = function(array, func) {
  if (array.length != 0) {
    func(array.shift());
    myLoop(array, func);
  }
}
</script>
</head>
<body>
 <button onclick="myLoop([0,1,2], alert);">test</button>
</body>
</html>

成功。
アラートが3回実行された。
JSの変数宣言が変なタイミングで実行されるのはこのためなのかな。

引数で省略可能なオプションを渡す方法

scriptaculousのdragdrop.jsから。

  • 引数がなければデフォルト
  • 引数があればデフォルトを上書き
 add: function(element) {
   element = $(element);
   var options = Object.extend({
     greedy:     true,
     hoverclass: null,
     tree:       false
   }, arguments[1] || {});