MVC (Rails)

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Motif Modèle-Vue-Contrôleur
Framework Rails
Modèle ActiveRecord::Base
Voir aussi Helper (Rails) · REST (Rails)

Le motif Modèle-Vue-Contrôleur (MVC) structure une application Rails : le routage dirige la requête vers un contrôleur, qui interroge un modèle et rend une vue.

Fichier:Mvc detailed.png

Routage

# config/routes.rb
DemoApp::Application.routes.draw do
  resources :users
end

Contrôleur

# app/controllers/users_controller.rb
class UsersController < ApplicationController
  def index;   end
  def show;    end
  def new;     end
  def create;  end
  def edit;    end
  def update;  end
  def destroy; end
end

Action index simplifiée :

class UsersController < ApplicationController
  def index
    @users = User.all
  end
end

Modèle

# app/models/user.rb
class User < ActiveRecord::Base
end

Une fois @users renseigné, le contrôleur appelle la vue. Les variables d'instance (préfixées @) sont automatiquement accessibles dans la vue.

Vue

<!-- app/views/users/index.html.erb -->
<h1>Liste des utilisateurs</h1>

<table>
  <tr><th>Nom</th><th>Email</th><th></th><th></th><th></th></tr>
  <% @users.each do |user| %>
    <tr>
      <td><%= user.nom %></td>
      <td><%= user.email %></td>
      <td><%= link_to 'Montrer', user %></td>
      <td><%= link_to 'Modifier', edit_user_path(user) %></td>
      <td><%= link_to 'Détruire', user, :confirm => 'Êtes-vous certain ?', :method => :delete %></td>
    </tr>
  <% end %>
</table>

<%= link_to 'New User', new_user_path %>

À ce stade il manque encore : validation des données, authentification, tests et mise en page.

Exemple : micro-messages

rails generate scaffold Micropost content:string user_id:integer
rake db:migrate

Premières validations :

# app/models/micropost.rb
class Micropost < ActiveRecord::Base
  validates :content, :length => { :maximum => 140 }
end

Associations (un utilisateur possède plusieurs micro-messages) :

# app/models/user.rb
class User < ActiveRecord::Base
  has_many :microposts
end

# app/models/micropost.rb
class Micropost < ActiveRecord::Base
  belongs_to :user
  validates :content, :length => { :maximum => 140 }
end

Vérification en console :

rails console
first_user = User.first
first_user.microposts
exit

Voir aussi