Haml と Sass (続き)「unexpected kENSURE, expecting kEND」

前回(Haml と Sass - Rubyとか Illustratorとか SFとか折紙とか)の続き

RSpec(Rails)とか Cucumberとかちょっと更新あったので、アプリケーション作成からもう一度。

(1)hs9587@vmw04[1163] rails haml_sass -dpostgresql
[~/project/haml_sass] <pts/3>
(1)hs9587@vmw04[1167] haml --rails .                                 14:02 0801
Haml plugin added to .
[~/project/haml_sass] <pts/3>
(1)hs9587@vmw04[1168] script/generate rspec                          14:03 0801
[~/project/haml_sass] <pts/3>
(1)hs9587@vmw04[1169] script/generate cucumber                       14:11 0801

それはこんな感じ。

About your application’s environment
Ruby version 1.8.7 (i486-linux) 
RubyGems version 1.3.5 
Rack version 1.0 
Rails version 2.3.3 
Active Record version 2.3.3 
Action Pack version 2.3.3 
Active Resource version 2.3.3 
Action Mailer version 2.3.3 
Active Support version 2.3.3 
Application root /home/hs9587/project/haml_sass 
Environment development 
Database adapter postgresql 
Database schema version 20090720122318 

Database schema version は前回のが後引いてる感じ、そのうち何とかなるでしょう。

index.html

ここでちょっと public/index.html を Haml化してみる。

[~/project/haml_sass] <pts/3>
(1)hs9587@vmw04[1181] md public/haml                                 14:23 0801
[~/project/haml_sass] <pts/3>
(1)hs9587@vmw04[1182] html2haml public/index.html > public/haml/index.haml

あたまのあたりとかこんな感じ、結構それっぽい。

      #content
        #header
          %h1
            Welcome aboard
          %h2
            You&rsquo;re riding Ruby on Rails!
        #about
          %h3
            %a{ :href => "rails/info/properties", :onclick => "about(); return false" }
              About your application&rsquo;s environment
          #about-content{ :style => "display: none" }
        #getting-started
          %h1
            Getting started
          %h2
            Here&rsquo;s how to get rolling:

だが、これを動的に提供する術はないみたい。それに、haml/index.haml がテキストとして見えてしまう。
可視性については置いといて、もとの index.html を上書きする感じで一々 hamlコマンドする事に。

[~/project/haml_sass] <pts/3>
(1)hs9587@vmw04[1187] haml public/haml/index.haml > public/index.html

さっきの #header (これは「<div id='header'>」以下を成す(「<>」全角半角注意)。あれ、「'」一重引用符(シングルクォート)良いんだっけか) にちょっと追加。次に作る Itemのリストへのリンク。

        #header
          %h1
            Welcome aboard
          %h2
            You&rsquo;re riding Ruby on Rails!
          %h2
            %a{ :href => 'items' }
              Items

そのままだと #headerスタイルの形が崩れる (Railsロゴの大きさ固定値の為) けどその辺は適当にする、要は \#headerの background-image: url("images/rails.png"); 指定の所で height: をどうにかする、解除する。

rspec_scaffold

取り敢えずモデル一つ作ってみる、前回と同じく

[~/project/haml_sass] <pts/3>
(1)hs9587@vmw04[1195] script/generate rspec_scaffold Item name:string description:text
[~/project/haml_sass] <pts/3>
(1)hs9587@vmw04[1196] script/generate feature Item name:string description:text

前回の DB引き摺ってて rake db:migrate エラーしたり。db:drop、db:create してからまた。

で、rake spec

36 examples, 0 failures

rake features も

2 scenarios (2 passed)
9 steps (9 passed)

scaffold.css、items.html.erb

scaffold.css

そして出来てる public/stylesheets/scaffold.css を変換する。変換先ディレクトリも用意する。

[~/project/haml_sass] <pts/3>
(1)hs9587@vmw04[1206] md public/stylesheets/sass                     15:18 0801
[~/project/haml_sass] <pts/3>
(1)hs9587@vmw04[1207] css2sass public/stylesheets/scaffold.css > public/stylesheets/sass/scaffold.sass

これで public/stylesheets/scaffold.css はそれなりに動的に生成されるようになってる(筈)
変換した scaffold.sass の出来がなんだかなあなのは前回通り。

items.html.erb

レイアウトの方。

[~/project/haml_sass] <pts/3>
(1)hs9587@vmw04[1219] html2haml app/views/layouts/items.html.erb app/views/layouts/items.html.haml
[~/project/haml_sass] <pts/3>
(1)hs9587@vmw04[1220] ls app/views/layouts                           15:32 0801
items.html.erb  items.html.haml

.erb の方は無しにする。

rake spec

36 examples, 0 failures

rake features

2 scenarios (2 passed)
9 steps (9 passed)

そしてビュー

まず一覧

[~/project/haml_sass] <pts/3>
(1)hs9587@vmw04[1224] html2haml app/views/items/index.html.erb app/views/items/index.html.haml
[~/project/haml_sass] <pts/3>
(1)hs9587@vmw04[1226] ls app/views/items/                            15:37 0801
edit.html.erb  index.html.erb  index.html.haml  new.html.erb  show.html.erb

両方ある状態で、.haml の方が優先になるみたい、しかしエラー

Haml::SyntaxError in Items#index 
Showing app/views/items/index.html.haml where line #21 raised: 

You don't need to use "- end" in Haml. Use indentation instead:
- if foo?
  %strong Foo!
- else
  Not foo.

Extracted source (around line #21): 

18:       = link_to 'Edit', edit_item_path(item)
19:     %td
20:       = link_to 'Destroy', item, :confirm => 'Are you sure?', :method => :delete
21:   - end
22: %br
23: = link_to 'New item', new_item_path



RAILS_ROOT: /home/hs9587/project/haml_sass

自動変換では、end はとってくれないようだ。しかし haml的にはそれは良くない。これくらいなんとかしてよ。
その .hamlはこんな感じ

%h1
  Listing items
%table
  %tr
    %th
      Name
    %th
      Description
  - @items.each do |item|
  %tr
    %td
      = h item.name
    %td
      = h item.description
    %td
      = link_to 'Show', item
    %td
      = link_to 'Edit', edit_item_path(item)
    %td
      = link_to 'Destroy', item, :confirm => 'Are you sure?', :method => :delete
  - end
%br
= link_to 'New item', new_item_path

まあ、直す、「- end」取る。.erbファイルの方も片付ける。

%h1
  Listing items
%table
  %tr
    %th
      Name
    %th
      Description
  - @items.each do |item|
  %tr
    %td
      = h item.name
    %td
      = h item.description
    %td
      = link_to 'Show', item
    %td
      = link_to 'Edit', edit_item_path(item)
    %td
      = link_to 'Destroy', item, :confirm => 'Are you sure?', :method => :delete
%br
= link_to 'New item', new_item_path

で、エラー。これでエラーだと言われてもなんだかよく分からない。

SyntaxError in Items#index 
Showing app/views/items/index.html.haml where line #24 raised: 

compile error
/home/hs9587/project/haml_sass/app/views/items/index.html.haml:24: syntax error, unexpected kENSURE, expecting kEND
/home/hs9587/project/haml_sass/app/views/items/index.html.haml:26: syntax error, unexpected $end, expecting kEND

Extracted source (around line #24): 

21: %br
22: = link_to 'New item', new_item_path


Trace of template inclusion: app/views/items/index.html.haml

rake spec のエラーは直接これとは関係ないのかな

1)
ActionView::MissingTemplate in '/items/index.html.erb renders a list of items'
Missing template items/index.html.erb in view path app/views
./spec/views/items/index.html.erb_spec.rb:20:

Finished in 0.8044 seconds

36 examples, 1 failure

rake features もエラー

Failing Scenarios:
cucumber features/manage_items.feature:14 # Scenario: Delete item

2 scenarios (1 failed, 1 passed)
9 steps (1 failed, 1 skipped, 7 passed)
0m0.598s

どうしようか。よく分からなくなってきた。

すぐに追記

単純にインデントの問題であった。自動変換でこれをしてくれないのは何だかなあ。

%h1
  Listing items
%table
  %tr
    %th
      Name
    %th
      Description
  - @items.each do |item|
    %tr
      %td
        = h item.name
      %td
        = h item.description
      %td
        = link_to 'Show', item
      %td
        = link_to 'Edit', edit_item_path(item)
      %td
        = link_to 'Destroy', item, :confirm => 'Are you sure?', :method => :delete
%br
= link_to 'New item', new_item_path

each節のインデントが足りなかった模様。

rake spec、rake features のエラーは儘。その辺はまた後で。