Weird Rails Gem

After updating rails I got an error ala `require_frameworks’:RuntimeError: RubyGem version error: rack(1.0.0 not ~> 1.0.1)

The solution is simple:

$ sudo gem install rack –version 1.0.1

2. problem: libxml2 is missing.  try ‘port install libxml2’ or ‘yum install libxml2-devel’


$ sudo apt-get install libxml2-dev

I also needed libxslt-dev to install the ruhl gem after that nokogiri-1.4.1 and ruhl-1.3.4 were successfully installed.

The only problem is now that ruhl woudn’t work with jruby :-(

Simplistic Texteditor for Your Next Ruby On Rails Webapplication


Do you want to come to the metaparty? Okay it is not a party tool it is a political site in German where the party member itself create the party platform. The vision is: if you vote for metapartei you will get representative candidates which supports the oppinion of the nation – not of a specific lobby. As a member of Metapartei you can create concepts (ideas) and vote for them. At some day the set of all voted concepts will be our party platform. was written entirely with rails and with the help NetBeans as IDE (I could displace aptana ;-)). It is and it was really fun. Especially the database migrations in rails are fantastic for production! Okay sometimes ruby wasn’t that much fun. For example the following passes (very strange!):

assert_equal 2, "ÄÄa__".mb_chars.index("a", 4)

In the meanwhile we have to decide how the user can input some more than only text. If you would allow pure html then you would introduce a big security hole! For example someone could then insert any javascript function he likes with e.g. the <script> tag. So we need a rich text editor. But which one? There are a lot of editors out to allow the user to mark up the text. See the appendix for some we had evaluated. But we finally choose


from Ryan Johnson, because it is very small and highly customizable. See here for a life example. The small trade-off we had to pay was that we had to implement the conversation from wiki text to html. But this was relative easy. See The ruby code (under public domain) for the WikiText class, which implements the following behaviour:

  • ”bold” to bold
  • ”’italic”’ to italic
  • line breaks to <br />
  • and links like [ Metapartei – a great idea] to Metapartei – a great idea

You can simply add other things (just let me know if you implement lists ;-)). But how you can embed the javascript with ruby? Here is the answer:

TextArea within Rails

Get the textarea.js from the TextArea bundle and put it under public/javascripts. Then create a file textarea_init.js from the code in the The javascript code section. Then insert

<%= javascript_include_tag 'textarea' %>

into app/views/layouts/application.html.erb (<head>HERE</head>). Then directly before the closing </body> tag write

<%= javascript_include_tag 'textarea_init' %>

Additionally you have to add a mark_down specific css file get it from the TextArea project too.

Now you can use it where you like. E.g. in the new template of the comments controller. Within new.html.erb add the following line as the very last:

<div id="markdown_formatted"></div>

But be sure that you specify at least one id for the text content (e.g. like we did: comment_content). See the javascript code section.

That’s it. Hope you enjoy it!

The ruby code

class WikiText
  def initialize(str)
    # process umlaute correctly
    @text = str.mb_chars

  def to_html
    str, ii = process_sub_tag(nil, 0)

  # returns the resulting string and the processed characters
  def process_sub_tag(until_tag_name, from_index)
    ii = from_index
    if(until_tag_name != nil)
      found_tag_index = @text.index(until_tag_name, from_index)
      if(found_tag_index != nil)
        until_index = found_tag_index + until_tag_name.length
        return "", 0
    until_index = @text.length if until_index == nil

    result = ""
    while(ii < until_index)
      # F... ruby: '\n' != "\n"
      if ( == "\n")
        result << "\n<br />"
        ii += 1

      elsif check_chars(ii, "'''")
        ii += 3
        if(until_tag_name == "'''")
        str, p_chars = process_sub_tag("'''", ii)
        result << "<b>" + str + "</b>"
        ii += p_chars

      elsif check_chars(ii, "''")
        ii += 2
        # closing tag
        if(until_tag_name == "''")
        last_index = @text.index("''", ii)
        if(last_index != nil)
          str, p_chars = process_sub_tag("''", ii)
          result << "<i>" + str + "</i>"
          ii += p_chars

      elsif check_chars(ii, "]")
        ii += 1

      elsif check_chars(ii, "[")
        ii += 1
        last_index = @text.index("]", ii)
        if(last_index != nil)
          res = @text[ii, last_index-1].split(' ')
          if(res.length > 1 && !res[1].blank?)
            ii += res[0].length+1
            str, p_chars = process_sub_tag("]", ii)
            result << '<a target="_blank" href="'+ res[0]+'">'+str+"</a>"
            ii += p_chars
        result <<
        ii += 1
    return result, ii - from_index

  # returns true if the specified chars match directly from the current position
  def check_chars(index, chars)
    len = chars.length
    #if (index > 0 && @text[index-1, 1] == ||
    #      index + len < @text.length && @text[index+len, 1] ==
    #  return false
    @text[index, len] == chars
# WARNING: with unicode it will not work 100%. See the strange assertion at the beginning of the blog post

The JavaScript code

 * @author Ryan Johnson <>
 * @copyright 2008 PersonalGrid Corporation <>
 * @package LivePipe UI
 * @license MIT
 * @url
 * @require prototype.js, livepipe.js, textarea.js

if(typeof(Control.TextArea) == "undefined")
    throw "Initialization requires Control.TextArea to be loaded.";

var idOfComponent = 'comment_content';
if($(idOfComponent) == null) {
    idOfComponent = 'concept_content';

if($(idOfComponent) != null) {
    var textarea = new Control.TextArea(idOfComponent);

    var toolbar = new Control.TextArea.ToolBar(textarea);

    //for css styles = 'markdown_toolbar';

        id: 'markdown_italics_button'

        id: 'markdown_bold_button'

        var selection = this.getSelection();
        var response = prompt('Enter Link URL','');
        if(response == null)
        this.replaceSelection('[' + (response == '' ? 'http://link_url/' : response).
            replace(/^(?!(f|ht)tps?:\/\/)/,'http://') + ' ' + (selection == '' ? 'Link Text' : selection) + ']');
        id: 'markdown_link_button'

        id: 'markdown_help_button'


For more editors look here.

Very Small Hints for ActionMailer

Hi, I lost some hours to figure out, what the problems were to make sending via smtp working.

Here is a list you should check if something does not work:

  1. To enable raising exceptions during email sending make sure you add the following line into environment.rb:
    config.action_mailer.raise_delivery_errors = true
    Or put it into the test.rb or development.rb which will overwrite the settings specified in environment.rb
  2. Enable real email sending in test environment is possible in test.rb via
    config.action_mailer.delivery_method = :smtp
    instead of
    config.action_mailer.delivery_method = :test
    or directly use the following line in the test code
    ActionMailer::Base.delivery_method = :smtp
  3. if you get for your yahoo accout sth. like: EOFError: end of file reached.
    Or for your gmx account:
    Net::SMTPFatalError: 550 5.1.7 This server does not accept an empty envelope from ( ) {mp038}
    You should check that the ‘from’ property is really only the email not anything else! (See the next point)
  4. If you use the restful_authentication plugin you can use the following code in user_mailer.rb:

    def setup_email(user,subj=nil)
    recipients  “#{}”
    from        “#{FROM_EMAIL}”
    subject     “[#{SITE}] #{subj}”
    body        :user => user

    In environment.rb directly after the rails gem version constant add:

    SITE = ‘;
    FROM_EMAIL = ‘’

    And in the ‘ do |config|’ block do:

    config.action_mailer.default_charset = “utf-8”
    config.action_mailer.delivery_method = :smtp
    config.action_mailer.smtp_settings = {
    :address => “” ,
    :port => 25,
    :domain => “localhost” ,
    :authentication => :login,
    :user_name => FROM_EMAIL ,
    :password => “donotshare”

My stony way to find a ruby on the rails

Ruby is a great language. All can be expressed so short and readable. That’s one side.

The other side is: you have to learn a lot of exceptions to common stuff that you already learned in another languages (In my case Java).

So today I will explain things where it took me a lot of time to understand how to do this and what ruby (and rails) does. Let us start with the very basics: installation and then the pure ruby language.

Setup MySql

If you use debian as OS it is quite simple to install mysql:

sudo apt-get install mysql-server

Then create a database with the following lines

mysql -u root -p
type the following in the mysql shell:


Later on you can log into the mysql database via
mysql -u admin -p
[now type the password ‘admin’]


I suggest you to use to view and even manipulate the database. The nice thing about this java program is: you can simply install the jdbc drivers for your database (e.g sqlite or mysql) and after configuring them you can browse the databases in a nice way!

Install Ruby and Rails

To be independend from Java or if you don’t want to use JRuby you have to install ruby on your machine:

sudo apt-get install ruby libzlib-ruby rdoc irb

Now install gems …

sudo apt-get install rubygems
sudo gem install mysql

… and rails

sudo apt-get install rails

Create a Skeleton Application

Optionally install NetBeans 6.1 (and Java >1.5 before) to get some handy functionality.

Be sure that you choose a package with rails or install the rails plugins via: Tools->Plugins.

Now you should able to create a rails application: New Project->Ruby On Rails Application. Click Next and choose your ruby system. (Or do ‘rails testapp’ on the command line).

You will get a list of created files. To quickly navigate to a file in NetBeans press ALT+SHIFT+O (Oh not zero) and type in the name. Now I will go through some of the generated files:


This is the base class for all of our controllers. To study the Model-View-Controller pattern visit wikipedia. In our controllers we put in all of our application logic. For example the password encryption when one of our user logs in.


In this helper modul we define some convinient methods for our view


With this class it is easy to test the implemented (helper) methods. Read “Agile Web Development with Rails” to be surprised that unit and even integration tests are very easy (and fast) to write.
The generated content looks like:
# your database server:
adapter: mysql
encoding: utf8
database: mydb
username: admin
password: admin
timeout: 5000
# necessary if you are on debian:
socket: /var/run/mysqld/mysqld.sock

Here you will define later more fine grained navigation rules for the pages of your web application.

In NetBeans (with rails of course) database-migrating is very easy: right click the project->Migrate Database->To [misc] Version or Clear…

Start the web server with F6 in NetBeans or type

ruby script\server

Then go to http://localhost:3000/ with your browser and you should see ruby’s welcome page.

Now we want to replace the index.html with an erb (like jsp) file. To do this we will remove the public/index.html file and do

script/generate controller home index

add the following to the routes.rb

map.home '', :controller => 'home', :action => 'index'

To add some more functionality to our rails application there are a lot of plugins available. One of them is the restful_authentication, where a tutorial plugin (or here) exists which itself references to a bunch of other useful plugins. Check them out!.

Now some comments on setting up the restful_authentication plugin: Add the following resource to your repositories if you need this plugin (and others from the author):

script/plugin source install restful_authentication

or simply do

script/plugin install

On my machine it took a lot of time and finished with an timeout error so I did:

sudo apt-get install git-corecd vendor/plugin && git clone git:// restful-authentication/ restful_authentication/ && cd ../..

Now generate the necessary classes:

script/generate authenticated user sessions --include-activation --stateful

My (unsorted) Comments

Try getting started with rails and come back here to read the following comments (or post your own!) if you figured out sth. worth enough to be said for beginners.

  1. For restful_authentication:
    Be sure that you ignore the config/initializers/site_keys.rb in your subversion!! But save it, because you will need it for your application!
  2. If need a login snippet like the one from the authentication tutorial:
    app/views/users/_user_bar.html.erb in your start up weü page app/views/home/index.html.erb
    Use the following line:
    <%= render(:partial => “users/user_bar”) %>
  3. If you need ssh2 try:
    # require ‘digest/sha1’
    require ‘digest/sha2’
    def User.mydigest(str)
  4. What the hell is this string with a colon? I mean the ‘:password’ here:
    update_attributes :password => ‘secure’
    It is called symbol and is the name of a variable e.g. of a class. Where ‘secure’ is the value of the variable password. So with this method call e.g. within the User class you do password = ‘secure’.
    var = { ‘a’ => ‘b’, 1 => ‘c’}
    assert_equals(‘b’, var[‘a’])
  5. And what is the :password => ‘secure’ statement?
    This is a key => value expression without the {} braces of the hash (Map in Java) , which are optional if the hash is the last parameter. This is very handy if you have several properties to set.
  6. What is ‘self’? It depends! Read more about self here!
    • global variables begins with @@
    • object variables begins with an @ (All the instance methods of a class can access this variable. So every object has its own set of object variables.)
    • local variable begins with a lower case character (except ‘self’)
    • constant variables begins with an upper case character (except ‘:symbol’)

    Warning: if you don’t add self in front of you object variables, ruby assumes that they are local!?

  7. What is attr_accessor :name? This will create a getter and a setter for the variable ‘name’.
    Or define a setter manually (via operator overloading)
    def volume=(vol)
    leftChannel = self.rightChannel = vol
  8. Where is the constructor of User? Do
    user =
  9. escape html in the view via h(user_input).
    For more security related stuff look here, here and here.
  10. The following line is not always secure (‘mass assignment’)[:user])
    To make it secure do:
    attr_accessible :name
    Now only the variable name can be change via url parameters.
  11. The following statement is unsecure
    User.find(:all, :conditions => [“name like ‘%#{params[:query]}%'”])
    :conditions => “name like ?”, ‘%’ + params[:query] + ‘%’
  12. add filter_parameter_logging :password to application.rb
    => all fields with names like “password” will get [FILTERED] in the logs
  13. Rails add a very handy method to objects:
    An object is blank if it‘s false, empty, or a whitespace string. For example, “”, ” “, nil, [], and {} are blank. Taken from here.
  14. There is no counter++
    Use counter += 1
  15. Swapping variables:
    a, b = b, a
    This work in methods too! E.g. return a pair of variables via
    def meth
    return a, b
    Now call the method
    b, a = meth
  16. if sugar – ‘the other wayround’
    puts ‘hello world’ if str == ‘name’
  17. defined? var
    will return true if there is a field named var
  18. You can use ‘hello’ or “hello”
    The only difference for those strings is the expression evaluation like “#{var}”
    This will work only in “”
  19. comments are like in bash: #
    Or use this to comment several lines:
    here is comment
    here too. WARING: =begin and =end has to be the first characters on the lines!
  20. Default values for method parameters via
    def meth(param=’test’)
  21. def see_how_to_throw
    # Do something nifty
    raise SomeError, “This is the error message!”
    rescue SomeError
    # This is executed when a SomeError exception is raised
    # to rethrow do
    # raise $!
    rescue AnotherError => error
    # Here, the exception object is referenced from the
    # `error’ variable
    # This is executed only if no exceptions were raised
    # This is always executed, exception or not
  22. A very useful tool for testing is autotest:
    gem install ZenTest
  23. It is eays to test with rails! Very easy to write unit and functional testing of your controllers and the pages.
    In NetBeans press ALT+F6 to start them.
  24. use %{ } for xml strings directly unescaped in the code! Very handy.
  25. Time sugar:
    3.minutes + 3.hours
    returns the result in seconds! Much more …
  26. counter ||= 0
    This statement will only be executed if counter is nil. Useful for singletons you think? Use self for this!
  27. Unicode support is not that good. Use Chars instead of the built in String class. Or convert to Chars before working with strings.
  28. Why are there named routes in routes.rb?
    These routes are accessible from the view. E.g. the following line is a named route (map.hello instead of map.resource)
    map.hello ‘/fhello’, :controller => ‘users’, :action => ‘hello’
    So the method hello will be invoke if the user click the link in the view which is generated via <%=hello_url%>
    One special name ‘map.resources’ indicates that rails should create 7 standard routes (4 of them are the CRUD methods). For example map.resources :articles will create the following routes:
    /articles (GET=>shows all, POST=>create a new)
    /articles/new (shows html for new article)
    /articles/1 (GET=>shows the first article, PUT=>update, DELETE=>deletes the article)
  29. parsing invalid xml with require ‘rubygems’ and require ‘rubyful_soup’. Then do:
    xml_data = Net::HTTP.get_response(URI.parse(url)).body
    doc =

Ruby 4 Java Programmers and Extreme Test Driven Development

Ruby 4 Java Programmers

I thought Ruby is just another language like Java to express things in a different syntax, but now I know that I was wrong. Look into these old, but really nice slides I discovered yesterday:

Let me know some other good articles about ruby!

Now I understand the ‘ruby hype’ a little bit better. Thank you Jim Weirich!

Extreme Test Driven Development

Did you write unit tests? Do you actually write unit tests?

Do you like TDD? If not then look here!

But what about these lines that are untested? Do you know them? Do you actually need them? Maybe you don’t need them, then you should have a look at this tool! It will remove all the untested code!

To discuss the political incorrect name of the project please feel free to post your opinion here.

Do you want to create decoupled unit tests? Then have a look at this tool, which uses the SecurityManager to ensure this!

You want to know if your unit tests are subtle enough? Try out jester! “It modifies your source code, runs the tests and reports if the tests pass despite the changes to the code. This can indicate missing tests or redundant code.” taken from the sourceforge mainpage of jester.