@JerfriedBlanchardBoly : votre version de rubygems semble obsolète, il faut le mettre à jour. Cela étant, ce cours ne prend pas en charge les systèmes d'exploitation Windows, ainsi je recommande plutôt de le suivre sous Ubuntu, par exemple.
J'en profite pour expliquer sommairement pourquoi le cours n'est pas proposé pour Windows, cela est principalement du à 2 raisons :
La première est que le terminal sous Windows n'est que très récent : il a été introduit en août 2016 dans Windows 10. Le cours ayant été écrit avant, il fallait faire plein de « hack » pour faire fonctionner Rails sur Windows : un nid à problèmes. Attention, à ne pas confondre avec l'invite de commande Windows, qui ressemble à un terminal mais n'en est pas un.
La seconde est que votre serveur d'hébergement utilisera Linux et non Windows dans 99.99 % des cas. Je recommande fortement de programmer avec Ubuntu ou OSX quand son serveur tourne avec Linux. En effet, certains éléments de votre programmer sera incompatible avec l'un ou l'autre des systèmes à moins, encore une fois, de beaucoup bidouiller – ce que je ne recommande pas.
Julien Grillot a écrit:
> La seconde est que votre serveur d'hébergement utilisera Linux et non Windows dans 99.99 % des cas. Je recommande fortement de programmer avec Ubuntu ou OSX quand son serveur tourne avec Linux. En effet, certains éléments de votre programmer sera incompatible avec l'un ou l'autre des systèmes à moins, encore une fois, de beaucoup bidouiller – ce que je ne recommande pas.
Sinon, lorsque l'on me pose la question, je propose d'installer Docker sous windows et de se créer un environnement de developpement sous Docker, cela permet de rester sur windows et d'avoir un moteur ruby fonctionnel sous linux !
Par contre petit problème pour la Partie Modèles du MOOC
je fais bundle install : erreur :
Downloading rdoc-4.2.0 revealed dependencies not in the API or the lockfile (json (~> 1.4)).
Either installing with `--full-index` or running `bundle update rdoc` should fix the problem.
Je fais bundle update doc et là ça marche.
Apres je fais comme demandé rake db:install et là c'est le drame :
rake aborted!
Gem::LoadError: You have already activated rake 12.0.0, but your Gemfile requires rake 10.4.2. Prepending `bundle exec` to your command may solve this.
Un peu (beaucoup) d'aide serait la bienvenue
EDIT :
Résolu (pour moi en tout cas!) après recherche sur Stackoverflow : faire commande "bundle update rake" puis de nouveau rake db:migrate
Je reçois un message d'erreur lorsque je fais bundle install sur la gem json :
An error occurred while installing json (1.8.3), and Bundler cannot continue.
Make sure that `gem install json -v '1.8.3'` succeeds before bundling.
J'imagine que c'est dû à un décalage de version que l'on utilise... J'ai fait plusieurs tentatives pour résoudre ce problème, mais au mieux j'arrive à faire l'installation puis la migration de la base de donnée pose problème...!
Avez-vous le même problème ? Pouvez-vous m'aider ? En attendant je vais continuer le cours avec mes propres fichiers et dossiers !
J'ai encore une question, concernant la correction des exercices. Je ne peux pas corriger un exo car je n'arrive pas à lancer le rails server. J'ai réussi à faire le bundle install sans erreur ni warning puis quand je fais rails s, j'obtiens des warnings concernant "Fixnum" et "Bignum" et une erreur me disant "stack level too deep".
Après de rapides recherches j'ai l'impression que c'est parceque la personne qui a fait l'exercice a utilisé une version de ruby inférieure à 2.4. Du coup j'ai 2 options :
- utiliser une ancienne version de rails pour lancer le rails server : comment le faire ? (Ca résoudrait peut-être mon problème précédent avec la gem json?)
- corriger un autre exercice, mais je n'en ai eu que 3 en tout et j'ai déjà fait les 2 autres : pouvez-vous m'en donner un autre ?
J'ai du mal à comprendre les liens qui se font entre les différentes structures (variables, modèles, vues, controleurs, migration etc ..), j'ai l'impression que parfois c'est un peu "magique", ça se fait tout seul. Soit. J'ai une question plus spécifique :
Lors de l'ajout de ces lignes :
# app/models/book.rb
class Book < ActiveRecord::Base
belongs_to :category
end
# app/models/category.rb
class Category < ActiveRecord::Base
has_many :books
end
Je comprends bien l'utilisation du pluriel et du singulier (un livre n'appartient qu'à UNE seule catégorie, une catégorie à plusieurs livre), j'aimerais savoir néanmoins à quoi les variables :books et :category font référence. On peut imaginer que :category fait référence à son modèle mais dans ce cas je ne vois pas à quoi :books peut faire référence (à la table ?). Est-ce là aussi la magie de RoR où on fait automatiquement le lien entre les structures malgré le pluriel, singulier ?
Merci, j'espère que vous pourrez éclairer ma lanterne
EDIT : et du coup cela ne fonctionne pas chez moi REEDIT : nevermind j'ai fait un bundle update et maintenant ça marche .. mystère.
book = Book.last
book.category
NoMethodError: undefined method `category' for #<Book:0x007f99544f0a48>
Did you mean? category_id
Tout d'abord merci pour ce cours très bien fait et terriblement intéressant!
J'ai cependant un problème que je n'arrive pas à résoudre : J'ai récupéré le code de l'auteur qui est a téléchargé dans le premier cours du chapitre "Maitrisez les modèles" puis poursuivi jusqu'au cours "les validations" et je me rends compte qu'il m'est impossible de modifier le titre d'un livre. Aucun problème pour en créer de nouveaux ou pour en supprimer mais le fait de vouloir en modifier un me renvoie sur cette page d'erreur :
Pourtant je ne vois pas d'erreur dans le fichier "route.rb" ni dans le "books_controller.rb" dont voici les codes :
routes.rb
Rails.application.routes.draw do
get 'books' => 'books#index'
post 'books' => 'books#create'
get 'books/:id' => 'books#show'
patch 'books/:id' => 'books#update'
delete 'books/:id' => 'books#destroy'
books_controller.rb
class BooksController < ApplicationController
def index
@books = Book.all
@categories = Category.all
end
def create
Book.create title: params[:title], category_id: params[:category_id]
redirect_to "/books"
end
def show
@book = Book.find(params[:id])
end
def update
@book = Book.find(params[:id])
if @book.update title: params[:title]
redirect_to "/books/#{params[:id]}"
else
render 'show'
end
end
def destroy
Book.find(params[:id]).destroy
redirect_to "/books"
end
end
J'essaye tout de même de continuer le cours mais sans comprendre pourquoi ça ne fonctionne pas c'est ennuyeux.
Perso je vois un id ce qui signifie que tu vas en avoir besoin pour identifier ton objet.
Dans ta route, il te manque l'id, du coup rails dit qu'il n'existe pas de route associé.
C'est juste ce qu'il te manque
Merci necros211 pour ta réponse mais je dois dire que je ne comprends pas... La route qui est donnée me semble bonne et fonctionne pour les autres (get, post, delete). Elle bloque seulement pour le "patch". Je ne comprends vraiment pas ce qu'il manque.
Tout d'abord merci Julien pour votre cours sur Rails.
J'en suis au chapitre sur la pagination et j'ai un soucis tout bête que je n'arrive pas à comprendre.
J'ai essayé dans la console le code que vous avez donné pour générer les 60 livres et bizarrement il me renvoie un message rollback transaction
Du coup j'aimerais comprendre ce qui se passe et savoir comment je pourrais générer 60 livres automatiquement parce que bon ... à la main ça serait une perte de temps. Et même temps si je n'ai pas suffisamment de livres il me sera difficile de tester le gem de pagination.
Si quelqu'un a une idée je suis preneur, merci d'avance.
Je précise que je suis sur Rails 5.1 et Ruby 2.4 sur macOS et que tous les codes du cours fonctionnent parfaitement (modulo quelques mini ajustement du types rails db:migrate au lieu de rake db:migrate).
class Book < ActiveRecord::Base
belongs_to :category
validates :title, presence:
{
message: "Le titre doit être renseigné."
}
validates :title, uniqueness:
{
message: "Ce titre est déjà pris."
}
scope :french, -> { where(category_id: 1) }
end
app/models/category.rb :
class Category < ActiveRecord::Base
has_many :books
end
alors voilà les captures de ma saisie (railsC1.png)
et des erreurs renvoyées (railsC2.png) lorsque je tape le code pour l'itération
60.times do |i|
Book.create title: "Livre n°#{i}"
end
Et voici ce que je vois sur la page d'index (index.png)
Puis sur celle du show enfin voici leurs codes respectifs
app/views/books/index :
<h1>Liste des livres</h1>
<% @books.each do |book| %>
<p><%= book_link book %></p>
<% end %>
<%= form_tag "/books", method: "post" do %>
<input type="text" name="title" placeholder="title" />
<input type="text" name="category_id" placeholder="category_id"/>
<select name="category_id">
<% @categories.each do |category| %>
<option value="<%= category.id %>">
<%= category.name %>
</option>
<% end %>
</select>
<input type="submit" value="Ajouter le livre" />
<% end %>
app/views/books/show :
<h1><%= @books.title %></h1>
<%= form_tag "/books/#{@books.id}", method: "patch" do %>
<input type="text"
name="title"
value="<%= @books.title %>"/>
<input type="submit"
value="Modifier le livre" />
<% end %>
<%= form_tag "/books/#{@books.id}", method: "delete" do %>
<input type="submit" value="Supprimer le livre" />
<% end %>
<p><a href="/books">Revenir à l'index</a></p>
Il me semble avoir suivi à la lettre les instructions du cours, si quelqu'un voit où est l'erreur merci de me le signaler parce que j'avoue que je ne comprends pas ce qui cloche.
Pour rappel je suis sur Rails 5.1 et Ruby 2.4 sur macOS
Merci par avance
- Edité par emacsfreeman 26 juillet 2017 à 17:04:54
Bonjour, merci à tous ceux qui apportent des réponses ici
Pour la question sur comment fonctionnent les has_many :books et belongs_to :category, Rails est en effet capable de « deviner » les modèles dont il est question, car il gère notamment la pluralisation (il est capable de comprendre que books vient de book ; et à partir de book il trouve le modèle Book). Pour l'anecdote, Rails gère aussi les exceptions anglaises, par exemple il est capable de passer de children à child !
@emacsfreeman : c'est lié à Rails 5, qui, par défaut, impose de renseigner les « belongs_to » lors de la création d'un objet. Par exemple, ces codes sont équivalents :
# Rails 4
class Book < ActiveRecord::Base
belongs_to :category
validates :category, presence: true
end
# Rails 5
class Book < ActiveRecord::Base
belongs_to :category
# pas besoin du validates qui est implicité
end
Pour ne pas imposer la présence d'une catégorie, il est possible de faire :
# Rails 5
class Book < ActiveRecord::Base
belongs_to :category, optional: true
end
Une autre possibilité serait d'assigner une catégorie aux livres créés :
# plusieurs façon de faire :
category_id = Category.first.id
60.times do |i|
Book.create title: "Livre n°#{i}", category_id: category_id
end
# ou
category = Category.first
60.times do |i|
Book.create title: "Livre n°#{i}", category: category
end
# ou
category = Category.first
60.times do |i|
category.books.create title: "Livre n°#{i}"
end
Je poste ce message dans le forum pour demander votre aide car ça faire longtemps que je cherche comment enregistrer les données d'un formulaire dans 2 table différent a la fois.
Voici la page que je souhaite réaliser.
Vous voyez donc qu'il y as 2 section, la section concernant l'offre elle même et la section concernant l'entreprise qui recrute. Les information des 2 section sont sur une page et seront enregistré dans 2 table différent lors de la soumission du formulaire.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Freelance, Architecte SI indépendant et optimiste de la Cyber Sécurité Retrouvez des tests, démo, tuto rapide sur mon blog
Architecte logiciel - Software craftsmanship convaincu.
Architecte logiciel - Software craftsmanship convaincu.
Architecte logiciel - Software craftsmanship convaincu.
Architecte logiciel - Software craftsmanship convaincu.
Architecte logiciel - Software craftsmanship convaincu.
Architecte logiciel - Software craftsmanship convaincu.
Architecte logiciel - Software craftsmanship convaincu.
Architecte logiciel - Software craftsmanship convaincu.
Architecte logiciel - Software craftsmanship convaincu.
Architecte logiciel - Software craftsmanship convaincu.
Architecte logiciel - Software craftsmanship convaincu.
Architecte logiciel - Software craftsmanship convaincu.