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] || {});