<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://lea-linux.org/docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rapsys</id>
	<title>Lea Linux - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://lea-linux.org/docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rapsys"/>
	<link rel="alternate" type="text/html" href="https://lea-linux.org/documentations/Sp%C3%A9cial:Contributions/Rapsys"/>
	<updated>2026-04-26T10:07:51Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Ruby_On_Rails&amp;diff=13879</id>
		<title>Ruby On Rails</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Ruby_On_Rails&amp;diff=13879"/>
		<updated>2006-10-23T13:38:31Z</updated>

		<summary type="html">&lt;p&gt;Rapsys : /* Modèle MVC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Développer sous Linux]]&lt;br /&gt;
= Ruby On Rails =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;leatitre&amp;quot;&amp;gt;Ruby On Rails&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;leapar&amp;quot;&amp;gt;par [mailto:gedsismik_at_free_point_fr GEDsismik]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;leadesc&amp;quot;&amp;gt;Monter un projet Ruby On Rails (RoR) pas à pas.&amp;lt;/div&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Avant propos ==&lt;br /&gt;
&lt;br /&gt;
Ruby On Rails (RoR) est un framework web écrit en ruby. Ce document vous présente comment faire un petit projet Ruby On Rails.&lt;br /&gt;
&lt;br /&gt;
On supposera installé et correctement configuré :&lt;br /&gt;
 - un SGBD supporté par RoR (personnellement, j&#039;utilise MySQL)&lt;br /&gt;
 - Ruby&lt;br /&gt;
 - Rails et ses dépendances&lt;br /&gt;
&lt;br /&gt;
Il vous faudra aussi des notions de ruby.&lt;br /&gt;
&lt;br /&gt;
Dans ce document, je mettrais en place un gestionnaire de livre rudimentaire. Le but est de présenter les bases d&#039;un projet Rails. Il est évident que ces informations sont loin d&#039;être exhaustives vue que RoR peut remplir tout un livre de 500 pages.&lt;br /&gt;
&lt;br /&gt;
== Mise en place de l&#039;environnement ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ rails monsite&lt;br /&gt;
      create  &lt;br /&gt;
      create  app/controllers&lt;br /&gt;
      create  app/helpers&lt;br /&gt;
      create  app/models&lt;br /&gt;
      create  app/views/layouts&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Le répertoire monsite vient d&#039;être créé ainsi que la structure initiale du projet. Entrez maintenant dans ce répertoire.&lt;br /&gt;
Normalement, il devrait contenir les fichiers et répertoires suivants : &lt;br /&gt;
&amp;lt;code&amp;gt;app&lt;br /&gt;
components&lt;br /&gt;
config&lt;br /&gt;
db&lt;br /&gt;
doc&lt;br /&gt;
lib&lt;br /&gt;
log&lt;br /&gt;
public&lt;br /&gt;
Rakefile&lt;br /&gt;
README&lt;br /&gt;
script&lt;br /&gt;
test&lt;br /&gt;
tmp&lt;br /&gt;
vendor&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Si vous n&#039;avez pas de base de donnée, créez-en :&lt;br /&gt;
&amp;lt;code&amp;gt;mysql&amp;gt; create database monsite_development;&lt;br /&gt;
mysql&amp;gt; create database monsite_test;&lt;br /&gt;
mysql&amp;gt; create database monsite_production;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;aparte&amp;quot;&amp;gt;&lt;br /&gt;
Note : J&#039;en ai crée 3 pour pouvoir utiliser 3 environnements différents. Une seule peut suffir, ca dépend de ce que vous voulez faire.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous allons ensuite éditer ./config/database.yml. Vous avez 3 environnements de pré-configurées de la sorte : &lt;br /&gt;
&amp;lt;code&amp;gt;production:&lt;br /&gt;
  adapter: mysql&lt;br /&gt;
  database: monsite_production&lt;br /&gt;
  username: root&lt;br /&gt;
  password:&lt;br /&gt;
  host: localhost&amp;lt;/code&amp;gt;&lt;br /&gt;
Avec :&lt;br /&gt;
* adapter le type de base de donnée (mysql, postgres, sqlite...)&lt;br /&gt;
* database le nom de la base de donnée&lt;br /&gt;
* username le nom de l&#039;utilisateur de la base de donnée&lt;br /&gt;
* password le mot de passe à la base de donnée&lt;br /&gt;
* host le serveur de base de donnée&lt;br /&gt;
Dans le cas de sqlite, on a :&lt;br /&gt;
* adapter le type de base de donnée (sqlite)&lt;br /&gt;
* dbfile nom du fichier de base de donnée &lt;br /&gt;
&lt;br /&gt;
Editez-le en fonction des paramètres de votre base de donnée. Exemple :&lt;br /&gt;
&amp;lt;code&amp;gt;production:&lt;br /&gt;
  adapter: mysql&lt;br /&gt;
  database: monsite_production&lt;br /&gt;
  username: gedsismik&lt;br /&gt;
  password: mypassword&lt;br /&gt;
  host: localhost&lt;br /&gt;
  socket: /var/run/mysql/mysql.sock&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;aparte&amp;quot;&amp;gt;&lt;br /&gt;
Note : Sous Slackware, j&#039;ai du ajouter la ligne &amp;lt;code&amp;gt;socket: /var/run/mysql/mysql.sock&amp;lt;/code&amp;gt; sinon il ne trouve pas la socket MySQL.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modèle MVC ==&lt;br /&gt;
&lt;br /&gt;
Ruby On Rails utilise le motif de conception MVC (modèle-vue-contrôleur). Je m&#039;explique : dans un projet RoR, vous séparez :&lt;br /&gt;
 - les modèles (répertoire &amp;lt;code&amp;gt;./app/models&amp;lt;/code&amp;gt;) : ce qui concerne les données.&lt;br /&gt;
&lt;br /&gt;
Dans notre cas, c&#039;est donc principalement les tables des bases de données.&lt;br /&gt;
 - les vues (répertoire &amp;lt;code&amp;gt;./app/views&amp;lt;/code&amp;gt;) : ce qui concerne l&#039;interface.&lt;br /&gt;
&lt;br /&gt;
Dans notre cas, il s&#039;agit de la présentation des pages (en HTML et Ruby embarqué, nous verrons ça plus tard).&lt;br /&gt;
 - les contrôleurs (répertoire &amp;lt;code&amp;gt;./app/controllers&amp;lt;/code&amp;gt;) : concerne la gestion des évenements.&lt;br /&gt;
&lt;br /&gt;
Dans notre cas, ce sont les classes qui feront le lien entre les tables (models) et le html (views).Ce qui revient aux appels aux tables via les modèles et la création de variables dont le contenu sera affiché dans les vues.&lt;br /&gt;
&lt;br /&gt;
Pour palier à certaines fonctions qui ne peuvent pas suivre le modèle MVC à la lettre, Rails dispose d&#039;une partie appelée helpers (&amp;lt;code&amp;gt;./app/helpers&amp;lt;/code&amp;gt;) qui contient des classes accessibles aux vues et qui contient du code ayant accès aux modèles sans passer par les contrôleurs.&lt;br /&gt;
&lt;br /&gt;
== Création des modèles ==&lt;br /&gt;
&lt;br /&gt;
=== Génération des fichiers relatifs à la table ===&lt;br /&gt;
&lt;br /&gt;
On va utilisez le script &amp;lt;code&amp;gt;./script/generate&amp;lt;/code&amp;gt; pour générer la première table.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ ./script/generate model livre&lt;br /&gt;
      exists  app/models/&lt;br /&gt;
      exists  test/unit/&lt;br /&gt;
      exists  test/fixtures/&lt;br /&gt;
      create  app/models/livre.rb&lt;br /&gt;
      create  test/unit/livre_test.rb&lt;br /&gt;
      create  test/fixtures/livres.yml&lt;br /&gt;
      create  db/migrate&lt;br /&gt;
      create  db/migrate/001_create_livres.rb&lt;br /&gt;
$ ./script/generate model auteur&lt;br /&gt;
      exists  app/models/&lt;br /&gt;
      exists  test/unit/&lt;br /&gt;
      exists  test/fixtures/&lt;br /&gt;
      create  app/models/auteur.rb&lt;br /&gt;
      create  test/unit/auteur_test.rb&lt;br /&gt;
      create  test/fixtures/auteurs.yml&lt;br /&gt;
      exists  db/migrate&lt;br /&gt;
      create  db/migrate/002_create_auteurs.rb&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fichiers de migration ===&lt;br /&gt;
&lt;br /&gt;
Les fichiers de migration/création de table se trouvent dans &amp;lt;code&amp;gt;./db/migrate&amp;lt;/code&amp;gt;. Il va falloir les éditez pour ajoutez les champs que vous voulez.&lt;br /&gt;
&amp;lt;div class=&amp;quot;aparte&amp;quot;&amp;gt;&lt;br /&gt;
Note : ne faites pas de champ &amp;quot;id&amp;quot;, ils sont automatiquement créés et gérer par Rails.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== create_livres.rb ====&lt;br /&gt;
Fichier ./db/migrate/001_create_livres.rb&lt;br /&gt;
&amp;lt;code&amp;gt;class CreateLivres &amp;lt; ActiveRecord::Migration&lt;br /&gt;
	def self.up&lt;br /&gt;
		create_table :livres do |t|&lt;br /&gt;
			t.column :titre, :string, :null =&amp;gt; false&lt;br /&gt;
			t.column :auteur_id, :integer, :null =&amp;gt; false&lt;br /&gt;
			t.column :quantite, :integer, :default =&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	def self.down&lt;br /&gt;
		drop_table :livres&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== create_auteurs.rb ====&lt;br /&gt;
Fichier ./db/migrate/002_create_auteurs.rb&lt;br /&gt;
&amp;lt;code&amp;gt;class CreateAuteurs &amp;lt; ActiveRecord::Migration&lt;br /&gt;
	def self.up&lt;br /&gt;
		create_table :auteurs do |t|&lt;br /&gt;
			t.column :nom, :string&lt;br /&gt;
			t.column :prenom, :string&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	def self.down&lt;br /&gt;
		drop_table :auteurs&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;aparte&amp;quot;&amp;gt;Notez que vous pouvez réunir les deux fichiers en un seul :&lt;br /&gt;
./db/migrate/001_initial.rb&lt;br /&gt;
&amp;lt;code&amp;gt;class Initial &amp;lt; ActiveRecord::Migration&lt;br /&gt;
	def self.up&lt;br /&gt;
		create_table :livres do |t|&lt;br /&gt;
			t.column :titre, :string, :null =&amp;gt; false&lt;br /&gt;
			t.column :auteur_id, :integer, :null =&amp;gt; false&lt;br /&gt;
			t.column :quantite, :integer, :default =&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		create_table :auteurs do |t|&lt;br /&gt;
			t.column :nom, :string, :null =&amp;gt; false&lt;br /&gt;
			t.column :prenom, :string&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	def self.down&lt;br /&gt;
		drop_table :livres&lt;br /&gt;
		drop_table :auteurs&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Génération des tables ===&lt;br /&gt;
&lt;br /&gt;
Toujours dans le repertoire monsite, exécutez &amp;lt;code&amp;gt;rake migrate&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;$ rake migrate&lt;br /&gt;
(in /home/gedsismik/monsite)&lt;br /&gt;
== CreateLivres: migrating ====================================================&lt;br /&gt;
-- create_table(:livres)&lt;br /&gt;
   -&amp;gt; 0.0441s&lt;br /&gt;
== CreateLivres: migrated (0.0442s) ===========================================&lt;br /&gt;
&lt;br /&gt;
== CreateAuteurs: migrating ===================================================&lt;br /&gt;
-- create_table(:auteurs)&lt;br /&gt;
   -&amp;gt; 0.0457s&lt;br /&gt;
== CreateAuteurs: migrated (0.0458s) ==========================================&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous regardez dans votre base de donnée, vous trouverez donc 3 tables :&lt;br /&gt;
 - auteurs&lt;br /&gt;
 - livres&lt;br /&gt;
 - schema_info&lt;br /&gt;
&lt;br /&gt;
Cette dernière table contient en fait la version de la base de donnée. Les versions sont incrémentées lors du &amp;lt;code&amp;gt;./script/generate model &amp;lt;nom table&amp;gt;&amp;lt;/code&amp;gt; et sont contenus dans le nom du fichier &amp;lt;code&amp;gt;./db/migrate/001_initial.rb&amp;lt;/code&amp;gt; est donc la version 1 de la base.&lt;br /&gt;
&lt;br /&gt;
=== Edition des modèles ===&lt;br /&gt;
Intéressons-nous aux fichiers &amp;lt;code&amp;gt;./app/models/auteur.rb&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;./app/models/livre.rb&amp;lt;/code&amp;gt;. Ces classes héritant de ActiveRecord::Base, presque tout est déjà fait. Nous allons juste ajouter la relation : &amp;quot;un auteur écrit plusieurs livres&amp;quot;. Cette relation se traduit dans &amp;lt;code&amp;gt;./app/models/auteur.rb&amp;lt;/code&amp;gt; par :&lt;br /&gt;
&amp;lt;code&amp;gt;class Auteur &amp;lt; ActiveRecord::Base&lt;br /&gt;
	has_many :livre&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En contrepartie, on peut avoir besoin d&#039;accéder à l&#039;auteur d&#039;un livre. Modifions donc &amp;lt;code&amp;gt;./app/models/livre.rb&amp;lt;/code&amp;gt; en :&lt;br /&gt;
&amp;lt;code&amp;gt;class Livre &amp;lt; ActiveRecord::Base&lt;br /&gt;
	belongs_to :auteur&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et voilà ! Ca devrait suffir pour les modèles. En effet, Rails fera tout seul le lien entre les deux tables grâce à auteur_id.&lt;br /&gt;
&lt;br /&gt;
== Création d&#039;un contrôleur ==&lt;br /&gt;
Tout d&#039;abord, utilisons, comme pour les modèles, le script &amp;lt;code&amp;gt;./script/generate&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;code&amp;gt;$ ./script/generate controller bibliotheque&lt;br /&gt;
      exists  app/controllers/&lt;br /&gt;
      exists  app/helpers/&lt;br /&gt;
      create  app/views/bibliotheque&lt;br /&gt;
      exists  test/functional/&lt;br /&gt;
      create  app/controllers/bibliotheque_controller.rb&lt;br /&gt;
      create  test/functional/bibliotheque_controller_test.rb&lt;br /&gt;
      create  app/helpers/bibliotheque_helper.rb&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Editons maintenant &amp;lt;code&amp;gt;./app/controllers/bibliotheque_controller.rb&amp;lt;/code&amp;gt;. Par défaut, vous avez :&lt;br /&gt;
&amp;lt;code&amp;gt;class BibliothequeController &amp;lt; ApplicationController&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous allons créer des actions. Un contrôleur peut comporter plusieurs actions.&lt;br /&gt;
&amp;lt;code&amp;gt;class BibliothequeController &amp;lt; ApplicationController&lt;br /&gt;
	def index&lt;br /&gt;
		listeAuteur&lt;br /&gt;
		render_action &#039;listeAuteur&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	def listeAuteur&lt;br /&gt;
		@auteurs = Auteur.find(:all, :order =&amp;gt; &amp;quot;nom,prenom&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	def ajoutAuteur&lt;br /&gt;
		param = @params[&#039;auteur&#039;]&lt;br /&gt;
		auteur = Auteur.new(param)&lt;br /&gt;
		if auteur.save&lt;br /&gt;
			flash[:ok] = &amp;quot;L&#039;auteur a &amp;amp;eacute;t&amp;amp;eacute; ajout&amp;amp;eacute;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			flash[:error] = &amp;quot;Probl&amp;amp;egrave;me à l&#039;ajout de l&#039;auteur&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		# ajoutAuteur n&#039;a pas besoin de vue. Une fois l&#039;auteur ajouté&lt;br /&gt;
		# on réaffiche la liste &lt;br /&gt;
		redirect_to :action =&amp;gt; &#039;listeAuteur&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;action index est l&#039;action par défaut. L&#039;action listeAuteur donnera la liste des auteurs. On constate ici qu&#039;on peut largement se passer d&#039;écrire du SQL dans Rails. @auteurs est une variable qui contiendra tous les auteurs.&lt;br /&gt;
&lt;br /&gt;
== Mise en place des vues ==&lt;br /&gt;
&lt;br /&gt;
=== Le layout ===&lt;br /&gt;
&lt;br /&gt;
Tout d&#039;abord, créons une layout. Le layout est la structure commune à toutes les pages. Ils se trouvent dans &amp;lt;code&amp;gt;./app/views/layouts/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;$ touch app/views/layouts/bibliotheque.rhtml&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Editons maintenant ce fichier :&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.0 Transitional//FR&amp;quot; &amp;quot;http://www.w3.org/TR/html4/loose.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;Biblioth&amp;amp;egrave;que - &amp;lt;%= controller.action_name %&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;GEDsismik&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=iso-8859-15&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Biblioth&amp;amp;egrave;que&amp;lt;/h1&amp;gt;&lt;br /&gt;
        &amp;lt;br/&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p style=&amp;quot;color: green&amp;quot;&amp;gt;&amp;lt;%= flash[:notice] %&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
        &amp;lt;%= @content_for_layout %&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
C&#039;est du Ruby embarqué dans du HTML. Pour ceux qui connaissent, c&#039;est un peu le même principe que le PHP. On écrit du HTML et aux endroits où on veut mettre du ruby, on place le code dans une balise &amp;lt;code&amp;gt;&amp;lt;% #code %&amp;gt;&amp;lt;/code&amp;gt;. Si on veut afficher la sortie du code, on place le code dans une balise &amp;lt;code&amp;gt;&amp;lt;%= #code %&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;%= @content_for_layout %&amp;gt;&amp;lt;/code&amp;gt; affichera la partie propre à l&#039;action.&lt;br /&gt;
&lt;br /&gt;
=== La vue ===&lt;br /&gt;
&lt;br /&gt;
Les vues sont dans un répertoire de la forme &amp;lt;code&amp;gt;./app/views/&amp;lt;contrôleur&amp;gt;/&amp;lt;/code&amp;gt; et porte le nom &amp;lt;code&amp;gt;&amp;lt;action&amp;gt;.rhtml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créons donc le fichier &amp;lt;code&amp;gt;./app/views/bibliotheque/listeAuteur.rhtml&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;h2&amp;gt;Liste des auteurs&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;%&lt;br /&gt;
	@auteurs.each do |auteur|&lt;br /&gt;
		%&amp;gt;&amp;lt;li&amp;gt;&amp;lt;%= auteur.nom + &amp;quot; &amp;quot; + auteur.prenom %&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;%&lt;br /&gt;
	end&lt;br /&gt;
%&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Ajout d&#039;un auteur&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;%= start_form_tag :action =&amp;gt; &amp;quot;ajoutAuteur&amp;quot; %&amp;gt;&lt;br /&gt;
	&amp;lt;p&amp;gt;&amp;lt;label&amp;gt;Pr&amp;amp;eacute;nom : &amp;lt;%= text_field &#039;auteur&#039;, &#039;prenom&#039; %&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
	&amp;lt;p&amp;gt;&amp;lt;label&amp;gt;Nom : &amp;lt;%= text_field &#039;auteur&#039;, &#039;nom&#039; %&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
	&amp;lt;%= submit_tag(&amp;quot;Ajouter&amp;quot;) %&amp;gt;&lt;br /&gt;
&amp;lt;%= end_form_tag %&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WebRick ==&lt;br /&gt;
&lt;br /&gt;
Vous disposez d&#039;un serveur de test appellé WebRick. Pour le lancez, tapez &amp;lt;code&amp;gt;./script/server &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$ ./script/server &lt;br /&gt;
=&amp;gt; Booting WEBrick...&lt;br /&gt;
=&amp;gt; Rails application started on http://0.0.0.0:3000&lt;br /&gt;
=&amp;gt; Ctrl-C to shutdown server; call with --help for options&lt;br /&gt;
[2006-10-19 18:32:57] INFO  WEBrick 1.3.1&lt;br /&gt;
[2006-10-19 18:32:57] INFO  ruby 1.8.5 (2006-08-25) [i686-linux]&lt;br /&gt;
[2006-10-19 18:32:57] INFO  WEBrick::HTTPServer#start: pid=26166 port=3000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par défaut, ce serveur écoute le port 3000. Ouvrez donc un navigateur et tapez : &amp;lt;code&amp;gt;http://localhost:3000&amp;lt;/code&amp;gt;.&lt;br /&gt;
Normalement, vous devriez obtenir une page de test. Les url de Rails par défaut se décompose de la sorte &amp;lt;code&amp;gt;http://localhost:3000/&amp;lt;contrôleur&amp;gt;/&amp;lt;action&amp;gt;[/&amp;lt;parametres&amp;gt;]&amp;lt;/code&amp;gt;. Tapez donc dans votre navigateur &amp;lt;code&amp;gt;http://localhost:3000/bibliotheque/listeAuteur&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Pour aller un peu plus loin ==&lt;br /&gt;
Ajoutons le support des livres dans &amp;lt;code&amp;gt;./app/controllers/bibliotheque_controller.rb&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;code&amp;gt;class BibliothequeController &amp;lt; ApplicationController&lt;br /&gt;
	def index&lt;br /&gt;
		listeLivre&lt;br /&gt;
		render_action &#039;listeLivre&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	def listeAuteur&lt;br /&gt;
		@auteurs = Auteur.find(:all, :order =&amp;gt; &amp;quot;nom,prenom&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	def listeLivre&lt;br /&gt;
		@livres = Livre.find(:all, :order =&amp;gt; &amp;quot;titre&amp;quot;)&lt;br /&gt;
		@auteurs = Auteur.find(:all, :order =&amp;gt; &amp;quot;nom,prenom&amp;quot;).map{ |u| [ u.nom + &amp;quot; (&amp;quot; + u.prenom + &amp;quot;)&amp;quot;, u.id] }&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	def ajoutAuteur&lt;br /&gt;
		param = @params[&#039;auteur&#039;]&lt;br /&gt;
		auteur = Auteur.new(param)&lt;br /&gt;
		if auteur.save&lt;br /&gt;
			flash[:ok] = &amp;quot;L&#039;auteur a &amp;amp;eacute;t&amp;amp;eacute; ajout&amp;amp;eacute;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			flash[:error] = &amp;quot;Probl&amp;amp;egrave;me à l&#039;ajout de l&#039;auteur&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		redirect_to :action =&amp;gt; &#039;listeAuteur&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	def ajoutLivre&lt;br /&gt;
		param = @params[&#039;livre&#039;]&lt;br /&gt;
		livre = Livre.new(param)&lt;br /&gt;
		if livre.save&lt;br /&gt;
			flash[:ok] = &amp;quot;Le livre a &amp;amp;eacute;t&amp;amp;eacute; ajout&amp;amp;eacute;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			flash[:error] = &amp;quot;Probl&amp;amp;egrave;me à l&#039;ajout du livre&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		redirect_to :action =&amp;gt; &#039;listeLivre&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créons du même coup la vue correspondante à listeLivre &amp;lt;code&amp;gt;./app/views/bibliotheque/listeLivre.rhtml&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;% if @livres.blank? %&amp;gt;&lt;br /&gt;
	&amp;lt;h2&amp;gt;Liste des ouvrages&amp;lt;/h2&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
	&amp;lt;%&lt;br /&gt;
		@livres.each do |livre|&lt;br /&gt;
			%&amp;gt;&amp;lt;li&amp;gt;&amp;lt;%= livre.titre %&amp;gt; - &amp;lt;%= livre.auteur.prenom + &amp;quot; &amp;quot; + livre.auteur.nom %&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;%&lt;br /&gt;
		end&lt;br /&gt;
	%&amp;gt;&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;% else %&amp;gt;&lt;br /&gt;
	&amp;lt;i&amp;gt;La bibliothèque ne contient aucun livre.&amp;lt;/i&amp;gt;&lt;br /&gt;
&amp;lt;% end %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;% unless @auteurs.blank? %&amp;gt;&lt;br /&gt;
	&amp;lt;h2&amp;gt;Ajout d&#039;un livre&amp;lt;/h2&amp;gt;&lt;br /&gt;
	&amp;lt;%= start_form_tag :action =&amp;gt; &amp;quot;ajoutLivre&amp;quot; %&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;&amp;lt;label&amp;gt;Titre : &amp;lt;%= text_field &#039;livre&#039;, &#039;titre&#039; %&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;&amp;lt;label&amp;gt;Nombre d&#039;exemplaire : &amp;lt;%= text_field &#039;livre&#039;, &#039;quantite&#039; %&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;&amp;lt;label&amp;gt;Auteur : &amp;lt;%= select(&#039;livre&#039;, &#039;auteur_id&#039;, @auteurs) %&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;%= submit_tag(&amp;quot;Ajouter&amp;quot;) %&amp;gt;&lt;br /&gt;
	&amp;lt;%= end_form_tag %&amp;gt;&lt;br /&gt;
&amp;lt;% end %&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Les environnements ==&lt;br /&gt;
Pour utiliser les différents environnements, vous devez manipuler la variable &amp;lt;code&amp;gt;RAILS_ENV&amp;lt;/code&amp;gt;. Par défaut, vous êtes dans le premier environnement du fichier &amp;lt;code&amp;gt;./config/database.yml&amp;lt;/code&amp;gt; (à savoir en général development). Pour un &amp;lt;code&amp;gt;rake migrate&amp;lt;/code&amp;gt; en production par exemple :&lt;br /&gt;
&amp;lt;code&amp;gt;RAILS_ENV=production rake migrate&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
notez que l&#039;environnement &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; efface les tables à chaque &amp;lt;code&amp;gt;rake&amp;lt;/code&amp;gt; et que l&#039;environnement &amp;lt;code&amp;gt;production&amp;lt;/code&amp;gt; n&#039;affiche aucune information en cas d&#039;exception (vous devez alors vous reportez aux fichiers de log &amp;lt;code&amp;gt;./log/&amp;lt;environnement&amp;gt;.log&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Copyright =&lt;br /&gt;
Copyright &amp;amp;copy; 19/10/2006, GEDsismik&lt;br /&gt;
{{CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Rapsys</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Ruby_On_Rails&amp;diff=13878</id>
		<title>Ruby On Rails</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Ruby_On_Rails&amp;diff=13878"/>
		<updated>2006-10-23T13:36:58Z</updated>

		<summary type="html">&lt;p&gt;Rapsys : /* Modèle MVC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Développer sous Linux]]&lt;br /&gt;
= Ruby On Rails =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;leatitre&amp;quot;&amp;gt;Ruby On Rails&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;leapar&amp;quot;&amp;gt;par [mailto:gedsismik_at_free_point_fr GEDsismik]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;leadesc&amp;quot;&amp;gt;Monter un projet Ruby On Rails (RoR) pas à pas.&amp;lt;/div&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Avant propos ==&lt;br /&gt;
&lt;br /&gt;
Ruby On Rails (RoR) est un framework web écrit en ruby. Ce document vous présente comment faire un petit projet Ruby On Rails.&lt;br /&gt;
&lt;br /&gt;
On supposera installé et correctement configuré :&lt;br /&gt;
 - un SGBD supporté par RoR (personnellement, j&#039;utilise MySQL)&lt;br /&gt;
 - Ruby&lt;br /&gt;
 - Rails et ses dépendances&lt;br /&gt;
&lt;br /&gt;
Il vous faudra aussi des notions de ruby.&lt;br /&gt;
&lt;br /&gt;
Dans ce document, je mettrais en place un gestionnaire de livre rudimentaire. Le but est de présenter les bases d&#039;un projet Rails. Il est évident que ces informations sont loin d&#039;être exhaustives vue que RoR peut remplir tout un livre de 500 pages.&lt;br /&gt;
&lt;br /&gt;
== Mise en place de l&#039;environnement ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ rails monsite&lt;br /&gt;
      create  &lt;br /&gt;
      create  app/controllers&lt;br /&gt;
      create  app/helpers&lt;br /&gt;
      create  app/models&lt;br /&gt;
      create  app/views/layouts&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Le répertoire monsite vient d&#039;être créé ainsi que la structure initiale du projet. Entrez maintenant dans ce répertoire.&lt;br /&gt;
Normalement, il devrait contenir les fichiers et répertoires suivants : &lt;br /&gt;
&amp;lt;code&amp;gt;app&lt;br /&gt;
components&lt;br /&gt;
config&lt;br /&gt;
db&lt;br /&gt;
doc&lt;br /&gt;
lib&lt;br /&gt;
log&lt;br /&gt;
public&lt;br /&gt;
Rakefile&lt;br /&gt;
README&lt;br /&gt;
script&lt;br /&gt;
test&lt;br /&gt;
tmp&lt;br /&gt;
vendor&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
Si vous n&#039;avez pas de base de donnée, créez-en :&lt;br /&gt;
&amp;lt;code&amp;gt;mysql&amp;gt; create database monsite_development;&lt;br /&gt;
mysql&amp;gt; create database monsite_test;&lt;br /&gt;
mysql&amp;gt; create database monsite_production;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;aparte&amp;quot;&amp;gt;&lt;br /&gt;
Note : J&#039;en ai crée 3 pour pouvoir utiliser 3 environnements différents. Une seule peut suffir, ca dépend de ce que vous voulez faire.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous allons ensuite éditer ./config/database.yml. Vous avez 3 environnements de pré-configurées de la sorte : &lt;br /&gt;
&amp;lt;code&amp;gt;production:&lt;br /&gt;
  adapter: mysql&lt;br /&gt;
  database: monsite_production&lt;br /&gt;
  username: root&lt;br /&gt;
  password:&lt;br /&gt;
  host: localhost&amp;lt;/code&amp;gt;&lt;br /&gt;
Avec :&lt;br /&gt;
* adapter le type de base de donnée (mysql, postgres, sqlite...)&lt;br /&gt;
* database le nom de la base de donnée&lt;br /&gt;
* username le nom de l&#039;utilisateur de la base de donnée&lt;br /&gt;
* password le mot de passe à la base de donnée&lt;br /&gt;
* host le serveur de base de donnée&lt;br /&gt;
Dans le cas de sqlite, on a :&lt;br /&gt;
* adapter le type de base de donnée (sqlite)&lt;br /&gt;
* dbfile nom du fichier de base de donnée &lt;br /&gt;
&lt;br /&gt;
Editez-le en fonction des paramètres de votre base de donnée. Exemple :&lt;br /&gt;
&amp;lt;code&amp;gt;production:&lt;br /&gt;
  adapter: mysql&lt;br /&gt;
  database: monsite_production&lt;br /&gt;
  username: gedsismik&lt;br /&gt;
  password: mypassword&lt;br /&gt;
  host: localhost&lt;br /&gt;
  socket: /var/run/mysql/mysql.sock&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;aparte&amp;quot;&amp;gt;&lt;br /&gt;
Note : Sous Slackware, j&#039;ai du ajouter la ligne &amp;lt;code&amp;gt;socket: /var/run/mysql/mysql.sock&amp;lt;/code&amp;gt; sinon il ne trouve pas la socket MySQL.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modèle MVC ==&lt;br /&gt;
&lt;br /&gt;
Ruby On Rails utilise le motif de conception MVC (modèle-vue-contrôleur). Je m&#039;explique : dans un projet RoR, vous séparez :&lt;br /&gt;
 - les modèles (répertoire &amp;lt;code&amp;gt;./app/models&amp;lt;/code&amp;gt;) : ce qui concerne les données. Dans notre cas, c&#039;est donc principalement les tables des bases de données.&lt;br /&gt;
 - les vues (répertoire &amp;lt;code&amp;gt;./app/views&amp;lt;/code&amp;gt;) : ce qui concerne l&#039;interface.&lt;br /&gt;
Dans notre cas, il s&#039;agit de la présentation des pages (en HTML et Ruby embarqué, nous verrons ça plus tard).&lt;br /&gt;
 - les contrôleurs (répertoire &amp;lt;code&amp;gt;./app/controllers&amp;lt;/code&amp;gt;) : concerne la gestion des évenements.&lt;br /&gt;
Dans notre cas, ce sont les classes qui feront le lien entre les tables (models) et le html (views).&lt;br /&gt;
Ce qui revient aux appels aux tables via les modèles et la création de variables dont le contenu sera affiché dans les vues.&lt;br /&gt;
&lt;br /&gt;
Pour palier à certaines fonctions qui ne peuvent pas suivre le modèle MVC à la lettre, Rails dispose d&#039;une partie appelée helpers (&amp;lt;code&amp;gt;./app/helpers&amp;lt;/code&amp;gt;) qui contient des classes accessibles aux vues et qui contient du code ayant accès aux modèles sans passer par les contrôleurs.&lt;br /&gt;
&lt;br /&gt;
== Création des modèles ==&lt;br /&gt;
&lt;br /&gt;
=== Génération des fichiers relatifs à la table ===&lt;br /&gt;
&lt;br /&gt;
On va utilisez le script &amp;lt;code&amp;gt;./script/generate&amp;lt;/code&amp;gt; pour générer la première table.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$ ./script/generate model livre&lt;br /&gt;
      exists  app/models/&lt;br /&gt;
      exists  test/unit/&lt;br /&gt;
      exists  test/fixtures/&lt;br /&gt;
      create  app/models/livre.rb&lt;br /&gt;
      create  test/unit/livre_test.rb&lt;br /&gt;
      create  test/fixtures/livres.yml&lt;br /&gt;
      create  db/migrate&lt;br /&gt;
      create  db/migrate/001_create_livres.rb&lt;br /&gt;
$ ./script/generate model auteur&lt;br /&gt;
      exists  app/models/&lt;br /&gt;
      exists  test/unit/&lt;br /&gt;
      exists  test/fixtures/&lt;br /&gt;
      create  app/models/auteur.rb&lt;br /&gt;
      create  test/unit/auteur_test.rb&lt;br /&gt;
      create  test/fixtures/auteurs.yml&lt;br /&gt;
      exists  db/migrate&lt;br /&gt;
      create  db/migrate/002_create_auteurs.rb&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fichiers de migration ===&lt;br /&gt;
&lt;br /&gt;
Les fichiers de migration/création de table se trouvent dans &amp;lt;code&amp;gt;./db/migrate&amp;lt;/code&amp;gt;. Il va falloir les éditez pour ajoutez les champs que vous voulez.&lt;br /&gt;
&amp;lt;div class=&amp;quot;aparte&amp;quot;&amp;gt;&lt;br /&gt;
Note : ne faites pas de champ &amp;quot;id&amp;quot;, ils sont automatiquement créés et gérer par Rails.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== create_livres.rb ====&lt;br /&gt;
Fichier ./db/migrate/001_create_livres.rb&lt;br /&gt;
&amp;lt;code&amp;gt;class CreateLivres &amp;lt; ActiveRecord::Migration&lt;br /&gt;
	def self.up&lt;br /&gt;
		create_table :livres do |t|&lt;br /&gt;
			t.column :titre, :string, :null =&amp;gt; false&lt;br /&gt;
			t.column :auteur_id, :integer, :null =&amp;gt; false&lt;br /&gt;
			t.column :quantite, :integer, :default =&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	def self.down&lt;br /&gt;
		drop_table :livres&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== create_auteurs.rb ====&lt;br /&gt;
Fichier ./db/migrate/002_create_auteurs.rb&lt;br /&gt;
&amp;lt;code&amp;gt;class CreateAuteurs &amp;lt; ActiveRecord::Migration&lt;br /&gt;
	def self.up&lt;br /&gt;
		create_table :auteurs do |t|&lt;br /&gt;
			t.column :nom, :string&lt;br /&gt;
			t.column :prenom, :string&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	def self.down&lt;br /&gt;
		drop_table :auteurs&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;aparte&amp;quot;&amp;gt;Notez que vous pouvez réunir les deux fichiers en un seul :&lt;br /&gt;
./db/migrate/001_initial.rb&lt;br /&gt;
&amp;lt;code&amp;gt;class Initial &amp;lt; ActiveRecord::Migration&lt;br /&gt;
	def self.up&lt;br /&gt;
		create_table :livres do |t|&lt;br /&gt;
			t.column :titre, :string, :null =&amp;gt; false&lt;br /&gt;
			t.column :auteur_id, :integer, :null =&amp;gt; false&lt;br /&gt;
			t.column :quantite, :integer, :default =&amp;gt; &amp;quot;1&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		create_table :auteurs do |t|&lt;br /&gt;
			t.column :nom, :string, :null =&amp;gt; false&lt;br /&gt;
			t.column :prenom, :string&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	def self.down&lt;br /&gt;
		drop_table :livres&lt;br /&gt;
		drop_table :auteurs&lt;br /&gt;
	end&lt;br /&gt;
end&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Génération des tables ===&lt;br /&gt;
&lt;br /&gt;
Toujours dans le repertoire monsite, exécutez &amp;lt;code&amp;gt;rake migrate&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;$ rake migrate&lt;br /&gt;
(in /home/gedsismik/monsite)&lt;br /&gt;
== CreateLivres: migrating ====================================================&lt;br /&gt;
-- create_table(:livres)&lt;br /&gt;
   -&amp;gt; 0.0441s&lt;br /&gt;
== CreateLivres: migrated (0.0442s) ===========================================&lt;br /&gt;
&lt;br /&gt;
== CreateAuteurs: migrating ===================================================&lt;br /&gt;
-- create_table(:auteurs)&lt;br /&gt;
   -&amp;gt; 0.0457s&lt;br /&gt;
== CreateAuteurs: migrated (0.0458s) ==========================================&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous regardez dans votre base de donnée, vous trouverez donc 3 tables :&lt;br /&gt;
 - auteurs&lt;br /&gt;
 - livres&lt;br /&gt;
 - schema_info&lt;br /&gt;
&lt;br /&gt;
Cette dernière table contient en fait la version de la base de donnée. Les versions sont incrémentées lors du &amp;lt;code&amp;gt;./script/generate model &amp;lt;nom table&amp;gt;&amp;lt;/code&amp;gt; et sont contenus dans le nom du fichier &amp;lt;code&amp;gt;./db/migrate/001_initial.rb&amp;lt;/code&amp;gt; est donc la version 1 de la base.&lt;br /&gt;
&lt;br /&gt;
=== Edition des modèles ===&lt;br /&gt;
Intéressons-nous aux fichiers &amp;lt;code&amp;gt;./app/models/auteur.rb&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;./app/models/livre.rb&amp;lt;/code&amp;gt;. Ces classes héritant de ActiveRecord::Base, presque tout est déjà fait. Nous allons juste ajouter la relation : &amp;quot;un auteur écrit plusieurs livres&amp;quot;. Cette relation se traduit dans &amp;lt;code&amp;gt;./app/models/auteur.rb&amp;lt;/code&amp;gt; par :&lt;br /&gt;
&amp;lt;code&amp;gt;class Auteur &amp;lt; ActiveRecord::Base&lt;br /&gt;
	has_many :livre&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En contrepartie, on peut avoir besoin d&#039;accéder à l&#039;auteur d&#039;un livre. Modifions donc &amp;lt;code&amp;gt;./app/models/livre.rb&amp;lt;/code&amp;gt; en :&lt;br /&gt;
&amp;lt;code&amp;gt;class Livre &amp;lt; ActiveRecord::Base&lt;br /&gt;
	belongs_to :auteur&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Et voilà ! Ca devrait suffir pour les modèles. En effet, Rails fera tout seul le lien entre les deux tables grâce à auteur_id.&lt;br /&gt;
&lt;br /&gt;
== Création d&#039;un contrôleur ==&lt;br /&gt;
Tout d&#039;abord, utilisons, comme pour les modèles, le script &amp;lt;code&amp;gt;./script/generate&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;code&amp;gt;$ ./script/generate controller bibliotheque&lt;br /&gt;
      exists  app/controllers/&lt;br /&gt;
      exists  app/helpers/&lt;br /&gt;
      create  app/views/bibliotheque&lt;br /&gt;
      exists  test/functional/&lt;br /&gt;
      create  app/controllers/bibliotheque_controller.rb&lt;br /&gt;
      create  test/functional/bibliotheque_controller_test.rb&lt;br /&gt;
      create  app/helpers/bibliotheque_helper.rb&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Editons maintenant &amp;lt;code&amp;gt;./app/controllers/bibliotheque_controller.rb&amp;lt;/code&amp;gt;. Par défaut, vous avez :&lt;br /&gt;
&amp;lt;code&amp;gt;class BibliothequeController &amp;lt; ApplicationController&lt;br /&gt;
end&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous allons créer des actions. Un contrôleur peut comporter plusieurs actions.&lt;br /&gt;
&amp;lt;code&amp;gt;class BibliothequeController &amp;lt; ApplicationController&lt;br /&gt;
	def index&lt;br /&gt;
		listeAuteur&lt;br /&gt;
		render_action &#039;listeAuteur&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	def listeAuteur&lt;br /&gt;
		@auteurs = Auteur.find(:all, :order =&amp;gt; &amp;quot;nom,prenom&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	def ajoutAuteur&lt;br /&gt;
		param = @params[&#039;auteur&#039;]&lt;br /&gt;
		auteur = Auteur.new(param)&lt;br /&gt;
		if auteur.save&lt;br /&gt;
			flash[:ok] = &amp;quot;L&#039;auteur a &amp;amp;eacute;t&amp;amp;eacute; ajout&amp;amp;eacute;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			flash[:error] = &amp;quot;Probl&amp;amp;egrave;me à l&#039;ajout de l&#039;auteur&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		# ajoutAuteur n&#039;a pas besoin de vue. Une fois l&#039;auteur ajouté&lt;br /&gt;
		# on réaffiche la liste &lt;br /&gt;
		redirect_to :action =&amp;gt; &#039;listeAuteur&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
L&#039;action index est l&#039;action par défaut. L&#039;action listeAuteur donnera la liste des auteurs. On constate ici qu&#039;on peut largement se passer d&#039;écrire du SQL dans Rails. @auteurs est une variable qui contiendra tous les auteurs.&lt;br /&gt;
&lt;br /&gt;
== Mise en place des vues ==&lt;br /&gt;
&lt;br /&gt;
=== Le layout ===&lt;br /&gt;
&lt;br /&gt;
Tout d&#039;abord, créons une layout. Le layout est la structure commune à toutes les pages. Ils se trouvent dans &amp;lt;code&amp;gt;./app/views/layouts/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;code&amp;gt;$ touch app/views/layouts/bibliotheque.rhtml&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Editons maintenant ce fichier :&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;-//W3C//DTD HTML 4.0 Transitional//FR&amp;quot; &amp;quot;http://www.w3.org/TR/html4/loose.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
        &amp;lt;title&amp;gt;Biblioth&amp;amp;egrave;que - &amp;lt;%= controller.action_name %&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;
        &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;GEDsismik&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=iso-8859-15&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;Biblioth&amp;amp;egrave;que&amp;lt;/h1&amp;gt;&lt;br /&gt;
        &amp;lt;br/&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;all&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p style=&amp;quot;color: green&amp;quot;&amp;gt;&amp;lt;%= flash[:notice] %&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
        &amp;lt;%= @content_for_layout %&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
C&#039;est du Ruby embarqué dans du HTML. Pour ceux qui connaissent, c&#039;est un peu le même principe que le PHP. On écrit du HTML et aux endroits où on veut mettre du ruby, on place le code dans une balise &amp;lt;code&amp;gt;&amp;lt;% #code %&amp;gt;&amp;lt;/code&amp;gt;. Si on veut afficher la sortie du code, on place le code dans une balise &amp;lt;code&amp;gt;&amp;lt;%= #code %&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;%= @content_for_layout %&amp;gt;&amp;lt;/code&amp;gt; affichera la partie propre à l&#039;action.&lt;br /&gt;
&lt;br /&gt;
=== La vue ===&lt;br /&gt;
&lt;br /&gt;
Les vues sont dans un répertoire de la forme &amp;lt;code&amp;gt;./app/views/&amp;lt;contrôleur&amp;gt;/&amp;lt;/code&amp;gt; et porte le nom &amp;lt;code&amp;gt;&amp;lt;action&amp;gt;.rhtml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créons donc le fichier &amp;lt;code&amp;gt;./app/views/bibliotheque/listeAuteur.rhtml&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;h2&amp;gt;Liste des auteurs&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;%&lt;br /&gt;
	@auteurs.each do |auteur|&lt;br /&gt;
		%&amp;gt;&amp;lt;li&amp;gt;&amp;lt;%= auteur.nom + &amp;quot; &amp;quot; + auteur.prenom %&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;%&lt;br /&gt;
	end&lt;br /&gt;
%&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Ajout d&#039;un auteur&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;%= start_form_tag :action =&amp;gt; &amp;quot;ajoutAuteur&amp;quot; %&amp;gt;&lt;br /&gt;
	&amp;lt;p&amp;gt;&amp;lt;label&amp;gt;Pr&amp;amp;eacute;nom : &amp;lt;%= text_field &#039;auteur&#039;, &#039;prenom&#039; %&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
	&amp;lt;p&amp;gt;&amp;lt;label&amp;gt;Nom : &amp;lt;%= text_field &#039;auteur&#039;, &#039;nom&#039; %&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
	&amp;lt;%= submit_tag(&amp;quot;Ajouter&amp;quot;) %&amp;gt;&lt;br /&gt;
&amp;lt;%= end_form_tag %&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== WebRick ==&lt;br /&gt;
&lt;br /&gt;
Vous disposez d&#039;un serveur de test appellé WebRick. Pour le lancez, tapez &amp;lt;code&amp;gt;./script/server &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;$ ./script/server &lt;br /&gt;
=&amp;gt; Booting WEBrick...&lt;br /&gt;
=&amp;gt; Rails application started on http://0.0.0.0:3000&lt;br /&gt;
=&amp;gt; Ctrl-C to shutdown server; call with --help for options&lt;br /&gt;
[2006-10-19 18:32:57] INFO  WEBrick 1.3.1&lt;br /&gt;
[2006-10-19 18:32:57] INFO  ruby 1.8.5 (2006-08-25) [i686-linux]&lt;br /&gt;
[2006-10-19 18:32:57] INFO  WEBrick::HTTPServer#start: pid=26166 port=3000&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par défaut, ce serveur écoute le port 3000. Ouvrez donc un navigateur et tapez : &amp;lt;code&amp;gt;http://localhost:3000&amp;lt;/code&amp;gt;.&lt;br /&gt;
Normalement, vous devriez obtenir une page de test. Les url de Rails par défaut se décompose de la sorte &amp;lt;code&amp;gt;http://localhost:3000/&amp;lt;contrôleur&amp;gt;/&amp;lt;action&amp;gt;[/&amp;lt;parametres&amp;gt;]&amp;lt;/code&amp;gt;. Tapez donc dans votre navigateur &amp;lt;code&amp;gt;http://localhost:3000/bibliotheque/listeAuteur&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Pour aller un peu plus loin ==&lt;br /&gt;
Ajoutons le support des livres dans &amp;lt;code&amp;gt;./app/controllers/bibliotheque_controller.rb&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;code&amp;gt;class BibliothequeController &amp;lt; ApplicationController&lt;br /&gt;
	def index&lt;br /&gt;
		listeLivre&lt;br /&gt;
		render_action &#039;listeLivre&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	def listeAuteur&lt;br /&gt;
		@auteurs = Auteur.find(:all, :order =&amp;gt; &amp;quot;nom,prenom&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	def listeLivre&lt;br /&gt;
		@livres = Livre.find(:all, :order =&amp;gt; &amp;quot;titre&amp;quot;)&lt;br /&gt;
		@auteurs = Auteur.find(:all, :order =&amp;gt; &amp;quot;nom,prenom&amp;quot;).map{ |u| [ u.nom + &amp;quot; (&amp;quot; + u.prenom + &amp;quot;)&amp;quot;, u.id] }&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	def ajoutAuteur&lt;br /&gt;
		param = @params[&#039;auteur&#039;]&lt;br /&gt;
		auteur = Auteur.new(param)&lt;br /&gt;
		if auteur.save&lt;br /&gt;
			flash[:ok] = &amp;quot;L&#039;auteur a &amp;amp;eacute;t&amp;amp;eacute; ajout&amp;amp;eacute;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			flash[:error] = &amp;quot;Probl&amp;amp;egrave;me à l&#039;ajout de l&#039;auteur&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		redirect_to :action =&amp;gt; &#039;listeAuteur&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	def ajoutLivre&lt;br /&gt;
		param = @params[&#039;livre&#039;]&lt;br /&gt;
		livre = Livre.new(param)&lt;br /&gt;
		if livre.save&lt;br /&gt;
			flash[:ok] = &amp;quot;Le livre a &amp;amp;eacute;t&amp;amp;eacute; ajout&amp;amp;eacute;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			flash[:error] = &amp;quot;Probl&amp;amp;egrave;me à l&#039;ajout du livre&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		redirect_to :action =&amp;gt; &#039;listeLivre&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Créons du même coup la vue correspondante à listeLivre &amp;lt;code&amp;gt;./app/views/bibliotheque/listeLivre.rhtml&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;% if @livres.blank? %&amp;gt;&lt;br /&gt;
	&amp;lt;h2&amp;gt;Liste des ouvrages&amp;lt;/h2&amp;gt;&lt;br /&gt;
	&amp;lt;ul&amp;gt;&lt;br /&gt;
	&amp;lt;%&lt;br /&gt;
		@livres.each do |livre|&lt;br /&gt;
			%&amp;gt;&amp;lt;li&amp;gt;&amp;lt;%= livre.titre %&amp;gt; - &amp;lt;%= livre.auteur.prenom + &amp;quot; &amp;quot; + livre.auteur.nom %&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;%&lt;br /&gt;
		end&lt;br /&gt;
	%&amp;gt;&lt;br /&gt;
	&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;% else %&amp;gt;&lt;br /&gt;
	&amp;lt;i&amp;gt;La bibliothèque ne contient aucun livre.&amp;lt;/i&amp;gt;&lt;br /&gt;
&amp;lt;% end %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;% unless @auteurs.blank? %&amp;gt;&lt;br /&gt;
	&amp;lt;h2&amp;gt;Ajout d&#039;un livre&amp;lt;/h2&amp;gt;&lt;br /&gt;
	&amp;lt;%= start_form_tag :action =&amp;gt; &amp;quot;ajoutLivre&amp;quot; %&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;&amp;lt;label&amp;gt;Titre : &amp;lt;%= text_field &#039;livre&#039;, &#039;titre&#039; %&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;&amp;lt;label&amp;gt;Nombre d&#039;exemplaire : &amp;lt;%= text_field &#039;livre&#039;, &#039;quantite&#039; %&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;p&amp;gt;&amp;lt;label&amp;gt;Auteur : &amp;lt;%= select(&#039;livre&#039;, &#039;auteur_id&#039;, @auteurs) %&amp;gt;&amp;lt;/label&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
		&amp;lt;%= submit_tag(&amp;quot;Ajouter&amp;quot;) %&amp;gt;&lt;br /&gt;
	&amp;lt;%= end_form_tag %&amp;gt;&lt;br /&gt;
&amp;lt;% end %&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Les environnements ==&lt;br /&gt;
Pour utiliser les différents environnements, vous devez manipuler la variable &amp;lt;code&amp;gt;RAILS_ENV&amp;lt;/code&amp;gt;. Par défaut, vous êtes dans le premier environnement du fichier &amp;lt;code&amp;gt;./config/database.yml&amp;lt;/code&amp;gt; (à savoir en général development). Pour un &amp;lt;code&amp;gt;rake migrate&amp;lt;/code&amp;gt; en production par exemple :&lt;br /&gt;
&amp;lt;code&amp;gt;RAILS_ENV=production rake migrate&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
notez que l&#039;environnement &amp;lt;code&amp;gt;test&amp;lt;/code&amp;gt; efface les tables à chaque &amp;lt;code&amp;gt;rake&amp;lt;/code&amp;gt; et que l&#039;environnement &amp;lt;code&amp;gt;production&amp;lt;/code&amp;gt; n&#039;affiche aucune information en cas d&#039;exception (vous devez alors vous reportez aux fichiers de log &amp;lt;code&amp;gt;./log/&amp;lt;environnement&amp;gt;.log&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Copyright =&lt;br /&gt;
Copyright &amp;amp;copy; 19/10/2006, GEDsismik&lt;br /&gt;
{{CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Rapsys</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Trucs:Gpg,_kmail_et_attachement_de_signature&amp;diff=12678</id>
		<title>Trucs:Gpg, kmail et attachement de signature</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Trucs:Gpg,_kmail_et_attachement_de_signature&amp;diff=12678"/>
		<updated>2006-05-21T12:24:48Z</updated>

		<summary type="html">&lt;p&gt;Rapsys : remise du © oublié&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;leapar&amp;quot;&amp;gt;fred&amp;lt;fred@lea-linux.org&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On prétend souvent que kmail n&#039;est pas compatible avec OpenPGP ou avec les attachements PGP/MIME. C&#039;est vrai que nativement c&#039;est le cas, mais un plugin pour kmail a été développé et il fonctionne très bien. Voilà comment procéder pour l&#039;installer et le configurer correctement.&lt;br /&gt;
&lt;br /&gt;
=== Les prérequis ===&lt;br /&gt;
&lt;br /&gt;
Il vous faut télécharger les logiciels suivants :&lt;br /&gt;
&lt;br /&gt;
# [ftp://ftp.gnupg.org/gcrypt/alpha/libgcrypt/ libgcrypt (&amp;gt;= 1.1.10)]&lt;br /&gt;
# [ftp://ftp.gnupg.org/gcrypt/alpha/aegypten/ libksba (&amp;gt;= 0.4.7)]&lt;br /&gt;
# [ftp://ftp.gnupg.org/gcrypt/alpha/aegypten/ newpg (&amp;gt;= 0.9.4)]&lt;br /&gt;
# [ftp://ftp.gnupg.org/gcrypt/gpgme/ gpgme 0.3.x (&amp;gt;= 0.3.15; &amp;lt; 0.4.0)]&lt;br /&gt;
# [ftp://ftp.gnupg.org/gcrypt/alpha/cryptplug/ cryptplug 0.3.x (&amp;gt;= 0.3.15)]&lt;br /&gt;
# [ftp://ftp.gnupg.org/gcrypt/pinentry/ pinentry (&amp;gt;= 0.6.8)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Note : beaucoup de ces librairies et utilisaires sont sûrement disponibles en tant que paquets binaires pour votre distribution : préférez leur utilisation à celles des sources proposés ici.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Je ne détaillerais pas ici l&#039;installation de tous ces utilitaires. Aprés décompactage, un simple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt; cd libgcrypt &amp;amp;&amp;amp; ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make check &amp;amp;&amp;amp; su -c &amp;quot;make install&amp;quot; &amp;lt;br /&amp;gt;cd libksba &amp;amp;&amp;amp; ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make check &amp;amp;&amp;amp; su -c &amp;quot;make install&amp;quot; &amp;lt;br /&amp;gt;cd newpg &amp;amp;&amp;amp; ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make check &amp;amp;&amp;amp; su -c &amp;quot;make install&amp;quot; &amp;lt;br /&amp;gt;cd gpgme &amp;amp;&amp;amp; ./configure --without-gpgsm &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make check &amp;amp;&amp;amp; su -c &amp;quot;make install&amp;quot; &amp;lt;br /&amp;gt;cd cryptplug &amp;amp;&amp;amp; ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; su -c &amp;quot;make install&amp;quot; &amp;lt;br /&amp;gt;cd pinentry &amp;amp;&amp;amp; ./configure --disable-pinentry-gtk --disable-pinentry-curses --disable-fallback-curses &amp;amp;&amp;amp; make &amp;amp;&amp;amp; su -c &amp;quot;make install&amp;quot; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
devrait faire l&#039;affaire.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Note: les &amp;lt;code&amp;gt;--disable-...&amp;lt;/code&amp;gt; dans l&#039;installation de pinentry sont facultatifs et peuvent être supprimés (ils ne servent qu&#039;a compiler pinentry pour QT).&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuration de GnuPG ===&lt;br /&gt;
&lt;br /&gt;
Il faut maintenant configurer GnuPG pour qu&#039;il puisse utiliser pinentry pour taper le mot de passe. Il suffit pour cela d&#039;éditer le fichier &amp;lt;code&amp;gt;~/.gnupg/gpg.conf&amp;lt;/code&amp;gt; (pour chaque utilisateur) et d&#039;y ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt; use-agent &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis de créer un fichier &amp;lt;code&amp;gt;~/.gnupg/gpg-agent.conf&amp;lt;/code&amp;gt; contenant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt; pinentry-program /usr/local/bin/pinentry-qt &amp;lt;br /&amp;gt;no-grab &amp;lt;br /&amp;gt;default-cache-ttl 1800 &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Evidemment le chemin conduisant à &amp;lt;code&amp;gt;pinentry-qt&amp;lt;/code&amp;gt; doit être adapté si vous avez installé pinentry autrement que de la manière indiquée.&lt;br /&gt;
&lt;br /&gt;
Ensuite, il faut faire en sorte de démarrer l&#039;agent GnuPG (ici, pinentry-qt) automatiquement, il y a plusieurs solutions.&lt;br /&gt;
&lt;br /&gt;
# Vous utilisez &amp;lt;code&amp;gt;~/.xsession&amp;lt;/code&amp;gt; pour démarrer votre interface graphique préférée, ajoutez en debut de ce fichier : &amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;eval &amp;quot;$(gpg-agent --daemon)&amp;quot; &amp;lt;/div&amp;gt;&lt;br /&gt;
# Vous utilisez xdm/kdm, ajoutez au fichier &amp;lt;code&amp;gt;/etc/X11/xdm/Xsession&amp;lt;/code&amp;gt; : &amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt; # gestion de l&#039;agent gpg &amp;lt;br /&amp;gt;if grep use-agent ~/.gnupg/gpg.conf &amp;amp;&amp;gt; /dev/null ; then &amp;lt;br /&amp;gt; eval &amp;quot;$(gpg-agent --daemon)&amp;quot; &amp;lt;br /&amp;gt;fi &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, rédemarrez votre interface graphique (c&#039;est le plus simple, bien que ce ne soit pas complétement nécessaire...)&lt;br /&gt;
&lt;br /&gt;
=== Configuration de kmail ===&lt;br /&gt;
&lt;br /&gt;
Lancez kmail, puis cliquez sur &amp;quot;Configuration&amp;quot; -&amp;gt; &amp;quot;Sécurité&amp;quot;, sélectionnez l&#039;onglet &amp;quot;OpenPGP&amp;quot;, vérifiez que vous avez bien sélectionné &amp;quot;GNU Privacy Guard (GnuPG)&amp;quot; comme outil de cryptage (mauvaise traduction, il faudrait utiliser &amp;quot;chiffrage&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Puis sélectionnez l&#039;onglet &amp;quot;Modules externes de cryptographie&amp;quot;. Cliquez sur &amp;quot;Nouveau&amp;quot;. Pour le &amp;quot;Nom&amp;quot; tapez ce que vous voulez, par exemple &amp;quot;PGP/Mime&amp;quot;. Pour l&#039;&amp;quot;Emplacement&amp;quot; tapez l&#039;emplacement de &amp;quot;gpgme-openpgp.so&amp;quot;, par défaut : &amp;lt;code&amp;gt;/usr/local/lib/cryptplug/gpgme-openpgp.so&amp;lt;/code&amp;gt;. Comme sur cette [http://kmail.kde.org/art/kmail-pgpmime-plugin-config.png image].&lt;br /&gt;
&lt;br /&gt;
Enfin, validez le tout.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation ===&lt;br /&gt;
&lt;br /&gt;
Lorsque vous voudrez chiffrer, signer ou déchiffrer un message vous verrez maintenant que kmail vous propose maintenant deux possibilités :&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;OpenPGP dans le corps du message (incorporé)&amp;quot;, c&#039;est ce qu&#039;il faisait sans l&#039;installation du plugin ;&lt;br /&gt;
# &amp;quot;PGP/Mime (module externe)&amp;quot;, c&#039;est le plugin qu&#039;on vient d&#039;installer. L&#039;utilisation du plugin, en plus de permettre le déchiffrage des messages PGP/Mime, permet aussi de chiffer et signer chaque pièce jointe individuellement. Mais attention : certains de vos correspondants utilisant un kmail &amp;quot;mal configuré&amp;quot; pourraient ne pas pouvoir les déchiffrer : indiquez leur ce truc pour qu&#039;ils puissent le faire. ;-)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Les mails avec pièce jointe chiffrée et signature en pièce jointe sont conformes à la norme, et interopérables avec les logiciels la respectant, comme Mozilla avec le plugin Enigmail, et même Outlook© avec les bons plugins.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Largement inspiré de [http://kmail.kde.org/kmail-pgpmime-howto.html kmail-pgpmime-howto.html].&lt;br /&gt;
[[Catégorie:Trucs_courrier]]&lt;/div&gt;</summary>
		<author><name>Rapsys</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Trucs:Gpg,_kmail_et_attachement_de_signature&amp;diff=12677</id>
		<title>Trucs:Gpg, kmail et attachement de signature</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Trucs:Gpg,_kmail_et_attachement_de_signature&amp;diff=12677"/>
		<updated>2006-05-21T12:22:53Z</updated>

		<summary type="html">&lt;p&gt;Rapsys : Correction de problème d&amp;#039;encoding (affichage d&amp;#039;utf-8 en iso8859-15), donc éèà et compagnie sont affiché n&amp;#039;importe comment...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;leapar&amp;quot;&amp;gt;fred&amp;lt;fred@lea-linux.org&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On prétend souvent que kmail n&#039;est pas compatible avec OpenPGP ou avec les attachements PGP/MIME. C&#039;est vrai que nativement c&#039;est le cas, mais un plugin pour kmail a été développé et il fonctionne très bien. Voilà comment procéder pour l&#039;installer et le configurer correctement.&lt;br /&gt;
&lt;br /&gt;
=== Les prérequis ===&lt;br /&gt;
&lt;br /&gt;
Il vous faut télécharger les logiciels suivants :&lt;br /&gt;
&lt;br /&gt;
# [ftp://ftp.gnupg.org/gcrypt/alpha/libgcrypt/ libgcrypt (&amp;gt;= 1.1.10)]&lt;br /&gt;
# [ftp://ftp.gnupg.org/gcrypt/alpha/aegypten/ libksba (&amp;gt;= 0.4.7)]&lt;br /&gt;
# [ftp://ftp.gnupg.org/gcrypt/alpha/aegypten/ newpg (&amp;gt;= 0.9.4)]&lt;br /&gt;
# [ftp://ftp.gnupg.org/gcrypt/gpgme/ gpgme 0.3.x (&amp;gt;= 0.3.15; &amp;lt; 0.4.0)]&lt;br /&gt;
# [ftp://ftp.gnupg.org/gcrypt/alpha/cryptplug/ cryptplug 0.3.x (&amp;gt;= 0.3.15)]&lt;br /&gt;
# [ftp://ftp.gnupg.org/gcrypt/pinentry/ pinentry (&amp;gt;= 0.6.8)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Note : beaucoup de ces librairies et utilisaires sont sûrement disponibles en tant que paquets binaires pour votre distribution : préférez leur utilisation à celles des sources proposés ici.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Je ne détaillerais pas ici l&#039;installation de tous ces utilitaires. Aprés décompactage, un simple :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt; cd libgcrypt &amp;amp;&amp;amp; ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make check &amp;amp;&amp;amp; su -c &amp;quot;make install&amp;quot; &amp;lt;br /&amp;gt;cd libksba &amp;amp;&amp;amp; ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make check &amp;amp;&amp;amp; su -c &amp;quot;make install&amp;quot; &amp;lt;br /&amp;gt;cd newpg &amp;amp;&amp;amp; ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make check &amp;amp;&amp;amp; su -c &amp;quot;make install&amp;quot; &amp;lt;br /&amp;gt;cd gpgme &amp;amp;&amp;amp; ./configure --without-gpgsm &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make check &amp;amp;&amp;amp; su -c &amp;quot;make install&amp;quot; &amp;lt;br /&amp;gt;cd cryptplug &amp;amp;&amp;amp; ./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; su -c &amp;quot;make install&amp;quot; &amp;lt;br /&amp;gt;cd pinentry &amp;amp;&amp;amp; ./configure --disable-pinentry-gtk --disable-pinentry-curses --disable-fallback-curses &amp;amp;&amp;amp; make &amp;amp;&amp;amp; su -c &amp;quot;make install&amp;quot; &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
devrait faire l&#039;affaire.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Note: les &amp;lt;code&amp;gt;--disable-...&amp;lt;/code&amp;gt; dans l&#039;installation de pinentry sont facultatifs et peuvent être supprimés (ils ne servent qu&#039;a compiler pinentry pour QT).&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuration de GnuPG ===&lt;br /&gt;
&lt;br /&gt;
Il faut maintenant configurer GnuPG pour qu&#039;il puisse utiliser pinentry pour taper le mot de passe. Il suffit pour cela d&#039;éditer le fichier &amp;lt;code&amp;gt;~/.gnupg/gpg.conf&amp;lt;/code&amp;gt; (pour chaque utilisateur) et d&#039;y ajouter la ligne :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt; use-agent &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis de créer un fichier &amp;lt;code&amp;gt;~/.gnupg/gpg-agent.conf&amp;lt;/code&amp;gt; contenant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt; pinentry-program /usr/local/bin/pinentry-qt &amp;lt;br /&amp;gt;no-grab &amp;lt;br /&amp;gt;default-cache-ttl 1800 &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Evidemment le chemin conduisant à &amp;lt;code&amp;gt;pinentry-qt&amp;lt;/code&amp;gt; doit être adapté si vous avez installé pinentry autrement que de la manière indiquée.&lt;br /&gt;
&lt;br /&gt;
Ensuite, il faut faire en sorte de démarrer l&#039;agent GnuPG (ici, pinentry-qt) automatiquement, il y a plusieurs solutions.&lt;br /&gt;
&lt;br /&gt;
# Vous utilisez &amp;lt;code&amp;gt;~/.xsession&amp;lt;/code&amp;gt; pour démarrer votre interface graphique préférée, ajoutez en debut de ce fichier : &amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt;eval &amp;quot;$(gpg-agent --daemon)&amp;quot; &amp;lt;/div&amp;gt;&lt;br /&gt;
# Vous utilisez xdm/kdm, ajoutez au fichier &amp;lt;code&amp;gt;/etc/X11/xdm/Xsession&amp;lt;/code&amp;gt; : &amp;lt;div class=&amp;quot;code&amp;quot;&amp;gt; # gestion de l&#039;agent gpg &amp;lt;br /&amp;gt;if grep use-agent ~/.gnupg/gpg.conf &amp;amp;&amp;gt; /dev/null ; then &amp;lt;br /&amp;gt; eval &amp;quot;$(gpg-agent --daemon)&amp;quot; &amp;lt;br /&amp;gt;fi &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, rédemarrez votre interface graphique (c&#039;est le plus simple, bien que ce ne soit pas complétement nécessaire...)&lt;br /&gt;
&lt;br /&gt;
=== Configuration de kmail ===&lt;br /&gt;
&lt;br /&gt;
Lancez kmail, puis cliquez sur &amp;quot;Configuration&amp;quot; -&amp;gt; &amp;quot;Sécurité&amp;quot;, sélectionnez l&#039;onglet &amp;quot;OpenPGP&amp;quot;, vérifiez que vous avez bien sélectionné &amp;quot;GNU Privacy Guard (GnuPG)&amp;quot; comme outil de cryptage (mauvaise traduction, il faudrait utiliser &amp;quot;chiffrage&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Puis sélectionnez l&#039;onglet &amp;quot;Modules externes de cryptographie&amp;quot;. Cliquez sur &amp;quot;Nouveau&amp;quot;. Pour le &amp;quot;Nom&amp;quot; tapez ce que vous voulez, par exemple &amp;quot;PGP/Mime&amp;quot;. Pour l&#039;&amp;quot;Emplacement&amp;quot; tapez l&#039;emplacement de &amp;quot;gpgme-openpgp.so&amp;quot;, par défaut : &amp;lt;code&amp;gt;/usr/local/lib/cryptplug/gpgme-openpgp.so&amp;lt;/code&amp;gt;. Comme sur cette [http://kmail.kde.org/art/kmail-pgpmime-plugin-config.png image].&lt;br /&gt;
&lt;br /&gt;
Enfin, validez le tout.&lt;br /&gt;
&lt;br /&gt;
=== Utilisation ===&lt;br /&gt;
&lt;br /&gt;
Lorsque vous voudrez chiffrer, signer ou déchiffrer un message vous verrez maintenant que kmail vous propose maintenant deux possibilités :&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;OpenPGP dans le corps du message (incorporé)&amp;quot;, c&#039;est ce qu&#039;il faisait sans l&#039;installation du plugin ;&lt;br /&gt;
# &amp;quot;PGP/Mime (module externe)&amp;quot;, c&#039;est le plugin qu&#039;on vient d&#039;installer. L&#039;utilisation du plugin, en plus de permettre le déchiffrage des messages PGP/Mime, permet aussi de chiffer et signer chaque pièce jointe individuellement. Mais attention : certains de vos correspondants utilisant un kmail &amp;quot;mal configuré&amp;quot; pourraient ne pas pouvoir les déchiffrer : indiquez leur ce truc pour qu&#039;ils puissent le faire. ;-)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;note&amp;quot;&amp;gt;Les mails avec pièce jointe chiffrée et signature en pièce jointe sont conformes à la norme, et interopérables avec les logiciels la respectant, comme Mozilla avec le plugin Enigmail, et même Outlook avec les bons plugins.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Largement inspiré de [http://kmail.kde.org/kmail-pgpmime-howto.html kmail-pgpmime-howto.html].&lt;br /&gt;
[[Catégorie:Trucs_courrier]]&lt;/div&gt;</summary>
		<author><name>Rapsys</name></author>
	</entry>
</feed>