Générer un Controller ou un Scaffold, ça va du singulier au pluriel

Si je fais :

ruby script/generate controller Post index

J’ai un Controller PostController.

Mais si je fais :

ruby script/generate scaffold Post title:string content:text

J’ai un Controller PostsController.

Pour Rails, un Model c’est au singulier, les tables c’est au pluriel. Les Controllers, ben ça dépend. Si Rails est capable avec un scaffold de mettre au pluriel un truc qu’on met au singulier, pourquoi ne pas le faire lorsque je génère un Controller, si c’est ça la convention ? Peut-être que ça ne change rien ?

Tiens j’ai lu ça :

Rails doesn’t tie controllers to models (i.e. it doesn’t look up the singular of the controller to find the model), you do this by using the model in the controller.

Et j’ai lu ça :

 <tpope> wincent: plural is conventional but not required like singular models are
<motion> wincent; name the controller BillyBob if you want
 <tpope> wincent: and yeah, it doesn't have to match up with a model
 <tpope> wincent: actually script/generate scaffold generates a singular model name. it then pluralizes
         that model name if no controller name is specified

Donc ça dépend que de moi. C’est quand j’utilise “Post.new” dans mon Controller que je fais appel à mon Model. Mais c’est le seul lien entre eux a priori.

Avec ou sans pluriel…

Je suis reparti avec 1 seul Controller : Artists.

Controller Artists

  def new
    @artist = Artist.new
 
    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @artist }
    end
  end
 
  # artist /artists
  # artist /artists.xml
  def create
    @artist = Artist.new(params[:post])
 
    respond_to do |format|
      if @artist.save
        flash[:notice] = 'Artist was successfully created.'
        format.html { redirect_to(@artist) }
      else
        format.html { render :action => "new" }
      end
    end
  end

View Artist new

<h1>Artists #new</h1>
<% form_for :artist, :url => { :action => "create" } do |f| %>
	<p>Name <%= f.text_field :name %></p>
	<p>Name Tag <%= f.text_field :name_tag %></p>
	<p><%= submit_tag 'Create' %></p>
<% end %>

Le formulaire, s’affiche. Mais dès que je veux le valider j’ai comme erreur :

undefined method `artist_url'

Je dis bien à mon formulaire d’utiliser la méthode create non ?

Je me suis dit que c’était un problème de singulier/pluriel, je sais pas. Mais j’ai testé avec un Controller au singulier, et j’ai la même erreur. Une idée ?

Supprimer un Controller

Quand on génère un Controller, ça crée plusieurs fichiers dans plusieurs dossiers, notamment les fichiers de test et les Views correspondants aux méthodes. Si on veut supprimer un Controller à la main, faut pas oublier un fichier. Rien de plus simple avec :

ruby script/destroy controller MonController

Ca supprime des fichiers et des dossiers (si ces derniers sont vides) :

          rm  test/unit/helpers/review_helper_test.rb
          rm  app/helpers/review_helper.rb
          rm  test/functional/review_controller_test.rb
          rm  app/controllers/review_controller.rb
       rmdir  test/unit/helpers
    notempty  test/unit
    notempty  test
       rmdir  test/functional
    notempty  test
    notempty  app/views/review
    notempty  app/views
    notempty  app
    notempty  app/helpers
    notempty  app
    notempty  app/controllers
    notempty  app

J’avais 4 Controllers mais ils étaient au singulier donc j’ai préféré les recréer au pluriel. J’ai viré les 4 puis refait les 4.

Vous noterez qu’il vire les dossiers “helpers” et “functional” qu’à la fin (vu que j’ai déjà viré les 3 autres Controllers).

Quoi de mieux pour apprendre…

… que de voir le code source d’autres applis Rails.

En parcourant le tag “ruby-on-rails” sur Stack Overflow, je suis tombé sur ce topic : What’s a good rails example application. J’ai par la suite téléchargé Mephisto et Tracks, juste pour voir. Les deux nécessitaient RoR 2.2.2 :

gem install -v=2.2.2 rails

Et ben malheureusement, j’arrive pas à les lancer. Je regarderai surtout le code source de toute façon.

Un Controller, c’est au pluriel ?

Je viens de créer mes 4 Controllers : Artist, Album, Article, Review. En voulant écrire mes méthodes, je suis allé voir dans les Controllers “scaffoldés” du blog. J’ai remarqué que les Controllers s’appelaient “Posts” et “Comments”. Puis en allant sur le site RoR Guide, j’ai remarqué que les exemples étaient au pluriel aussi. Alors maintenant je me pose la question : est-ce que c’est obligatoire ? Qu’est-ce que ça change ? Et si je veux passer de singulier à pluriel, je dois juste changer les noms des Controllers et des fichiers/dossiers ?

Concept

Tous les jours, je passe au moins 29 minutes à apprendre un nouveau langage et je poste quotidiennement mon avancée.

C’est ma solution pour lutter contre la procrastination.

To-do list

  • Lancer le site
  • Ruby
  • Rails
  • jQuery
  • AS3

Genèse

Découvrez pourquoi et comment tout a commencé.