I'm trying to switch over to using HAML for my views but I keep getting unexpected KENSURE messages. I've used html2haml to switch over working view files. First run through it told me I didn't need the end that html2haml had in its output so I removed it and now I get errors that look like it is complaining about the form not being ended.
What am I doing wrong?
error message:
compile error
app/views/sessions/new.html.haml:20: syntax error, unexpected kENSURE, expecting kEND
app/views/sessions/new.html.haml:22: syntax error, unexpected $end, expecting kEND
application.html.haml:
!!!
%html
%head
%title
= APP_CONFIG[:site_name] + ': ' + @page_title
== <meta http-equiv="content-type" content="text/xhtml; charset=utf-8" />
== <meta http-equiv="imagetoolbar" content="no" />
== <meta name="distribution" content="all" />
== <meta name="robots" content="all" />
== <meta name="resource-type" content="document" />
== <meta name="MSSmartTagsPreventParsing" content="true" />
= stylesheet_link_tag 'base'
= javascript_include_tag :defaults
%body
#container
#header
- if logged_in?
= link_to 'Logout', logout_path
- else
= link_to 'Login', login_path
= link_to 'Signup', signup_path
#content
= flash_messages
= yield :layout
and sessions/new.html.haml
= title "Login", :h2
- form_tag session_path do
%fieldset
%legend
Your Details
%ol
%li
= label_tag 'login', 'Username'
= text_field_tag 'login', @login
%li
= label_tag 'password'
= password_field_tag 'password', nil
%li
= label_tag 'remember_me', 'Remember me'
= check_box_tag 'remember_me', '1', @remember_me
.buttons
= submit_tag 'Login'
= link_to 'Forgotten Password', forgot_password_path
This is something haml does when you've gotten your spacing wrong. html2haml does most of the work for you, but you still have to review the changes. The problem in sessions/new.html.haml is that you are starting a do block with no content:
- form_tag session_path do
%fieldset
The whole fieldset should be nested (indented) within that do
block. Because there's no content at all, haml fails to put in an end
declaration, so when the file gets interpreted, you get:
unexpected $end, expecting kEND
meaning "I hit the end of the file ($end), I was expecting the end keyword (kEND)"
As shown, the first chunk has %body indented one level more than %head, and %head at the same level as %html, neither of which is good. If it works, you may get something like
<html>
</html>
<head>
...
<body>
...
</body>
</head>
I think most browsers will choke on that! ;-)
In general I'm not a fan of html2haml, which although it tries hard doesn't seem to be able to handle everything. Unless you have a seriously large pile of view files, I'd be inclined to spend the time reworking the files by hand. You don't have to do them all at once, why not just translate them as you go? You'll learn a lot more about HAML that way, too. Enough that - hopefully - you'll find the whole indentation thing becomes instinctive, after which progress begins to accelerate.
HAML behaves really poorly with problems like tabs instead of whitespace, and incorrect indentation.
My workaround (at least on OSX using TextMate) is to use TextMate, have the HAML/SASS bundle installed. Then I use CMD-[ to un-indent the text, following by CMD-] to re-indent the text properly. That gets rid of any invisible tabs and incorrect indentation, plus reveals any structural problems.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With