iPhotoLensの書き直し
前回のiPhotoLensのコードは酷かった...。
- コントローラーの命名レベルが変。(「pictures」...お手本のPicLens Publisherは「gallery」)
- アクション名が名詞(photos)だったり、
- それを強引にルート設定(:collection => { :photos => :get })したり、
- Rails2.0なのに.rxml拡張子使ったり、
- その呼び出しにphotos_pictures_path(:path=>params[:path])を使ったものだから、
- コントローラーでrender :layout=>falseなんて書いてる...。
- ヘルパメソッドも使わず、コピー&ペーストのHTMLべた書きが多い。
「とりあえず動けばいい」優先で作っていたら、こんな状態になってしまった。このままでは検索でヒットした時、余計な混乱を生じて迷惑になるので、もう一度書き直してみた。
書き直しの方針
- galleriesコントローラーが画像のフォルダパスを管理して、
- RSSの管理はphotosコントローラーを新たに作って、そちらに任せる。
- 分かり易いRESTなURL設定を目指して、
- 便利なペルパメソッドで読み易いコードを心掛ける。(もちろん楽もする。)
- Webmaster's Guideの仕様になるべく合わせる。
ひたすらコーディング
- まずはターミナルでの操作から...
$ rails iPhotoLens $ cd iPhotoLens $ script/generate scaffold gallery path:string $ rake db:migrate $ script/generate controller photos index
- ルートの追加。(オレンジ色の部分)
# config/routes.rb ActionController::Routing::Routes.draw do |map| map.resources :galleries map.resources :photos ...(中略)... # Install the default routes as the lowest priority. map.connect ':controller/:action/:id' map.connect ':controller/:action/:id.:format' end
- RSS auto-discoveryと、javascriptのPicLensLiteの読み込み。(<%##追記##%>の2行)
<%# app/views/layouts/galleries.html.erb %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <title>Galleries: <%= controller.action_name %></title> <%= stylesheet_link_tag 'scaffold' %> <%= auto_discovery_link_tag :rss, formatted_photos_path(:rss, :path=>params[:path]) %><%##追記##%> <%= javascript_include_tag "http://lite.piclens.com/current/piclens.js" %><%##追記##%> </head> <body> <p style="color: green"><%= flash[:notice] %></p> <%= yield %> </body> </html>
- RSSのコントローラーを追記。(オレンジ色の部分)
# app/controllers/photo_controller.rb class PhotosController < ApplicationController def index type = "jpg,JPG,png,PNG,gif,GIF" path = File.expand_path(params[:path]) exclude_path = File.expand_path("~/Pictures/iPhoto Library/Data") @photos = Dir::glob("#{path}/*.{#{type}}") + Dir::glob("#{path}/**/*.{#{type}}") - Dir::glob("#{exclude_path}/**/*.{#{type}}") end end
- 以下のファイルが、上記コントローラーと連携してRSSを生成する。(このファイルはすべてオリジナル)
- scaffoldで生成されたファイルの名称を変更する。app/views/photos/index.html.erb → index.rss.builder
# app/views/photos/index.rss.builder xml.instruct! xml.rss('version' => '2.0', 'xmlns:media' => "http://search.yahoo.com/mrss", 'xmlns:atom' => "http://www.w3.org/2005/Atom") do xml.channel do xml.generator("iPhotoLens 0.1") xml.atom(:icon, image_path('rails.png')) @photos.each do |f| file = URI.escape(f) file_path = "file://" + file thumbnail_path = file_path.gsub("images", "thumbs") if /\/images/ =~ f thumbnail_path ||= file_path.gsub("/iPhoto%20Library/Originals/", "/iPhoto%20Library/Data/") xml.item do xml.title(file) xml.link(file_path) xml.media(:thumbnail, :url=>thumbnail_path) xml.media(:content, :url=>file_path) end end end end
- indexページにPicLensモードへ移行するリンクを追加。(<%##変更##%>の部分)
<%# app/views/galleries/index.html.erb %> <h1>Listing galleries</h1> <table> <tr> <th>Path</th> </tr> <% for gallery in @galleries %> <tr> <%#=h gallery.path %> <%##変更##%> <td><%= link_to h(gallery.path) + image_tag("http://lite.piclens.com/images/PicLensButton.png", :alt=>"PicLens", :width=>"16", :height=>"12", :border=>"0", :align=>"baseline"), gallery_path(gallery, :path=>gallery.path) %></td> <td><%= link_to 'Show', gallery %></td> <td><%= link_to 'Edit', edit_gallery_path(gallery) %></td> <td><%= link_to 'Destroy', gallery, :confirm => 'Are you sure?', :method => :delete %></td> </tr> <% end %> </table> <br /> <%= link_to 'New gallery', new_gallery_path %>
- showページにPicLensモードへ移行するリンクを追加。(<%##変更##%>の部分)
- ページを読み込んだ時にPicLensモードに移行するjavascriptを追加。(<%##追記##%>の部分)
<%# app/views/galleries/show.html.erb %> <p> <b>Path:</b> <%#=h @gallery.path %> <%##変更##%> <%= link_to h(@gallery.path) + image_tag("http://lite.piclens.com/images/PicLensButton.png", :alt=>"PicLens", :width=>"16", :height=>"12", :border=>"0", :align=>"baseline"), gallery_path(@gallery, :path=>@gallery.path) %> </p> <%= link_to 'Edit', edit_gallery_path(@gallery) %> | <%= link_to 'Back', galleries_path %> <%##追記##%> <% unless params[:path].blank? %> <%= javascript_tag "PicLensLite.start();" %> <% end %>
以上で完了!やるべきことが分かっている時の、Railsのスピード感て素晴らしい。