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行)
    • formatted_photos_path(:rss, :path=>params[:path])によって、app/views/photos/index.rss.builderを利用することができる。
<%# 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.erbindex.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のスピード感て素晴らしい。