Rails: Time, DateTime, Timezones…. wait, what?

Everything happens in UTC!
Thats the one basic thing you must know about handling Times in Rails.

SomeModel.create(:time_attribute => Time.now)
SomeModel.create(:time_attribute => Time.zone.now)

Both lines will insert the same value into the database –> UTC+0. ActiveRecord will automaticly convert the given time. Therefore the config.time_zone in application.rb only controlls the default timezone and not the Timezone format the database will store the attribute.

You can also safely compare times that are in different zones – you don’t need to convert them to some common timezone.

A good link I found while adding time zones to our own project was this: http://www.redguava.com.au/2010/12/rails-basics-handling-user-timezones-in-rails/

I18n Rails – How to organize your locales in larger projects

As our rails projects grow bigger and bigger, the i18n locale files easily get messy and will loose their structure after a while. Especially when you have multiple software developers work on the same project.

So we develped a solution for us that is easier to handle and to maintain. The starting point is from the ruby on rails guides combined with this blog post:

We separated our yml files to the folders given by the rails structure. The yml files themself are also structured that way. This is a bit more efford in the beginning, but it is very nice to maintain, because you always know, where you have to put your locales and always know where to look for them!

|-defaults
|---de.rb
|---en.rb
|-models
|---survey
|-----de.rb
|-----en.rb
|-views
|---defaults
|-----de.rb
|-----en.rb
|---surveys
|-----de.rb
|-----en.rb
|---users
|-----de.rb
|-----en.rb

Each file now only handles the content of one logical controller unit. The views/surveys files now have the content for each action. We group them in the action to logical groups that always look the same. We have a title, the breadcrumbs and then we have a unit for each form.

en:
  views:
    surveys:
      index:
        title:
          text: :defaults.surveys
        breadcrumbs:
          surveys:
            text: :defaults.surveys
        form_q:
          fields:
            search_field:
              placeholder: 'Search surveys...'
              legend:
                text: 'Search'
              topics_title_cont_any:
                label: 'Topics'
                input:
                  placeholder: ''
              title_cont:
                label: 'Title'
                input:
                  placeholder: ''
        submit:
          text: :views.defaults.search
          disable_with: :views.defaults.form.searching

The problem with a solution like that is, that you have lots of redundant data. Take breadcrumbs for example. In each views folder there are different actions that have the same breadcrumb navigation. But there is a nice feature that you can use for that:

We put all business dependend locals into the defaults or views/defaults folders and reference them with e.g. :defaults.surveys. That makes it easy to have on each page every element, that can be translated to each language, but also removes redundant translations. But if you come to a language that make it harder to translate everything with the same translation you can translate that one separately!! Which can be quite important for example for languages like chinese.

Why Ruby on Rails

Why Ruby on Rails

I am writing software about 10 years by now. The last 3 years I was delighted by the great web application framework Ruby on Rails, which I don’t want to miss anymore. I want to publish articles in this blog every now and then and will mostly write about this awesome framework. So I want to tell you some good reasons, why I like to use it:

  1. Rails is good for rapid prototyping
  2. Ruby is easy to learn
  3. Rails code is easy to read because of the given structure

Rapid prototyping with Rails

I originally come from the java world. Setting up a new project got easier over the years but it is no comparison on what rails can do. Most blog posts I read when I started learning rails were about scaffolding. Scaffolding is a fast and easy way to create CRUD model/controller/view from scratch.

I usually do not use scaffolding in my working projects anymore, because they usually create a big overhead, but I just love that feature when it comes to a rapid prototype. A first version of our tutorize.com website was created in rails. It was not beautiful, not secure and not even close to be finished, but we had something to show to investors and possible customers. Lot of startup authors say that is the approach that works best for creating businesses without spending lots of money and time and then creating something that nobody even cares about. And I completely agree with it!

Ruby is easy to learn

I just have to say this: Ruby is a quite elegant language. If you have not tried it yet, try it. And the Rails framework is just

Rails code is easy to read because of the given structure

Rails comes with a given MVC-Pattern structure. It is really easy for other developers to dig into someone elses code because of that structure. You know where you find your models, your controllers and views and you know where the urls are build, etc. Very helpful!

And there is also the given structure of the rails engines. I started working with them a while ago and I can also say that this structure helps to understand the code of someone elses engine.

There are lots of features that I could take about right now, but I will leave some space for more posts to come. So try rails and keep on reading.

Collapsible CSS3 paper cards, inspired by Google Material Design

I`m a big fan of the Google Material Design. In particular, the paper card accordion. So I made one myself.

paper-collapse

Demo

Feel free to fork me on Github.

<div class="collapse-card">
  <div class="title">
    <i class="fa fa-question-circle fa-2x fa-fw"></i>
    <span>
      <!-- Optional right aligned text -->
    </span>
    <strong>
      <!-- Title Text -->
    </strong>
  </div>
  <div class="body">
    <!-- Body Text -->
  </div>
</div>