Archives de
Tag: rails 4

Rails 4 et MongoDB part 4 : Heroku

Rails 4 et MongoDB part 4 : Heroku

Heroku est un service paas pour héberger des applications facilement. Afin de s’en servir facilement il faut suivre quelques conseils.

Premièrement, modifiez votre fichier mongoid.yml pour y ajouter :

production:
  sessions:
    default:
      uri: <%= ENV['MONGOHQ_URL'] %>
      options:
        skip_version_check: true
        safe: true

Une fois fait, ajoutez la gem rails_12factor à votre projet.

Créez-vous ensuite un compte sur Heroku, puis installez la Heroku Toolbelt. Allez alors dans le dossier de votre application et lancez les commandes suivantes :

heroku login
heroku create --region eu
heroku addons:add mongohq:small
git push heroku master

La 3e ligne sert à ajouter une base MongoDB à votre instance Heroku.

Une fois fait vous devriez alors pouvoir accéder à votre application en ligne.

Si vous utilisez Travi-CI vous pouvez le configurer afin qu’après un build réussît, le déploiement se fasse sur Heroku. Pour ce faire installer la gem travis avec la commande suivante :

gem install travis -v 1.5.4 --no-rdoc --no-ri

Toujours dans le dossier de votre application lancez la commande suivante pour mettre à jour votre fichier .travis.yml avec les informations requises pour Heroku :

travis setup heroku

Rajoutez la ligne run: rake assets:precompile dans la section deploy de votre fichier .travis.yml.

Lors de votre prochain push sur GitHub, à la fin du build Travis si vos tests sont tous passés, votre instance d’Heroku sera mise à jour.

Rails 4 et MongoDB part 2 : Cucumber

Rails 4 et MongoDB part 2 : Cucumber

Dans l’article précédent, nous nous étions arrêté après l’utilisation du scaffolding pour créer un document dans MongoDB et le CRUD qui va avec.

Parmi les fichiers générés nous avons :

Afin de commencer par de bonnes pratiques, nous allons créer nos premiers tests BDD avec Cucumber.

Le BDD, Behavior Driven Developmen, est une méthode agile qui consiste à écrire des tests de scénarios décrivant le comportement de l’application dans un langage le plus proche possible de celui de l’humain. Un exemple valant mieux qu’un long discoure, voilà le scénario décrivant la page de listing des posts :

Scenario: Posts List
    Given I have posts titled Paris, Marseille
    When I go to the list of posts
    Then I should see "Paris"
    And I should see "Marseille"

En lisant ce texte, il est facile de savoir ce qu’il se passe et ce qui va être testé.

Afin de commencer, copiez le code suivant dans le fichier features/posts.feature :

Feature: Manage posts
  In order to make a blog
  As an author
  I want to create and manage posts

  Scenario: Posts List
    Given I have posts titled Paris, Marseille
    When I go to the list of posts
    Then I should see "Paris"
    And I should see "Marseille"

Ici nous avons juste rajouté le bloc Feature afin de décrire la fonctionnalité qui sera testée.
Une fois fait, en ligne de commande lancez : rake cucumber

Vous devriez alors avoir la sortie suivante :

cucumber1Cucumber nous indique ici qu’il ne comprend pas les différentes étapes de notre test. En effet il ne peut pas comprend sans qu’on lui explique ce qu’il faire pour la ligne Given I have posts titled Paris, Marseille. Il nous faut écrire le code correspondant a cette étape. Créez alors un fichier step_definitions/posts_steps.rb puis ajoutez-y :

Given /^I have posts titled (.+)$/ do |names|
  names.split(', ').each do |name|
    Post.create!(:name => name)
  end
end

Que faisons-nous ici ? La 1re ligne est une expression régulière afin de définir quelle étape nous définissons, elle capture tout ce qui suit et le fournit dans la variable names .

À la ligne 2, nous divisons la variable sur et itérons sur les valeurs retournées afin de les ajouter dans MongoDB grâce à la ligne 3.

Si nous relançons les tests nous pouvons voir que nous somme allez plus loin cette fois.

cucumber2Il ne nous reste plus qu’à définir les autres étapes de notre test afin d’avoir 100% dans nos scénarios :

cucumber3Pour voir le code, j’ai créé un dépôt GitHub : https://github.com/dayofr/rails_tuto .

Dans le prochain article je parlerais d’intégration continue avec Travis-ci.

Rails 4 et MongoDB part 1

Rails 4 et MongoDB part 1

Changeons un peu et parlons de Ruby, Ruby on Rails et MongoDB.

J’ai eu envie de voir ce qu’il se fait ailleurs et je pense que l’univers de RoR vaut le détour.

En partant du principe que vous avez Ruby d’installer sur votre machine, l’installation de RoR est aussi simple que :

gem install rails

Une fois cela fait, il suffit d’une autre ligne de commande pour créer un projet RoR :

rails new my_project --skip-active-record --skip-test-unit

Dans le cas présent, je n’installe pas ce qui concerne les bases de données si les tests unitaires.

Pour voir le résultat il suffit de se déplacer dans le dossier my_project et de lancer le serveur embarqué :

cd my_project/
rails server

Rendez-vous sur http://localhost:3000/ afin de voir la page par défaut.

Passons à l’ajout de la gestion de MongoDB à Mongoid travers la gem et des gem de tests. Pour cela il faut editer le fichier Gemfile et y rajouter:

gem 'mongoid', github: 'mongoid/mongoid'
gem 'bson_ext'

group :test do
  gem "rspec-rails"
  gem 'cucumber-rails', :require => false
  gem 'database_cleaner'
end

Avec la sortie récente de RoR 4, la gem mongoid n’est pas encore totalement compatible, dans notre cas nous disons à bundler d’aller la chercher sur github.

Un petit bundle install afin d’installer les nouvelles gem et nous voila prêt pour la suite.

Premièrement, il faut configurer mongoid avec :

rails generate mongoid:config

Afin de générer les fichiers pour les tests, lançons les 2 commandes suivantes :

rails generate rspec:install
rails generate cucumber:install

Avant d’aller plus loin, il faut désactiver quelques éléments prévus pour des applications avec une base de données relationnelle.

Dans le fichier spec/spec_helper.rb commentez les lignes :

config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = true

Pour finir dans le fichier features/support/env.rb  changez DatabaseCleaner.strategy = :transaction  par DatabaseCleaner.strategy = :truncation .

Passons aux choses sérieuses avec la génération d’un model et du CRUD associé. Comme souvent, une ligne de commande suffit :

rails generate scaffold post name:string description:text

Je vous laisse découvrir ce qui fonctionne en allant sur : http://localhost:3000/posts