Je suis en train d'écrire un petit CMS en tant que projet de test Rails (prévoyant également de l'utiliser pour mon site web personnel). Je veux des URL favorables au référencement, donc j'ai un test pour vérifier que les permaliens sont automatiquement créés en fonction du titre d'une page (par exemple About Us => about-us). Je ne peux pas comprendre pourquoi ce test échoue, cependant. Voici le code (j'utilise Rails 2.3.2):Création de permaliens (slugs) dans Rails - pourquoi mon test échoue-t-il?
# page_test.rb
# note I am using the "shoulda" framework
require 'test_helper'
class PageTest < ActiveSupport::TestCase
should_validate_presence_of :title, :permalink, :content
should_validate_uniqueness_of :title
should "create permalink automatically" do
p = pages(:sample_page)
p.save
assert_equal "sample-page", p.permalink
end
end
# pages.yml
sample_page:
title: Sample Page
permalink: # gets automatically created by model
content: This is a sample page
# page.rb
class Page < ActiveRecord::Base
validates_presence_of :title, :permalink, :content
validates_uniqueness_of :title
before_save :generate_permalink
private
def generate_permalink
self.permalink = self.title.parameterize
end
end
Ce qui se passe est que le permalien est nul, au lieu de « échantillon pages » comme il est censé être. Il fonctionne, cependant, si je mets manuellement le permalien dans l'appareil et de changer le test autour, par exemple:
p - pages(:sample_page)
p.title = "Contact Us"
p.save
assert_equal "contact-us", p.permalink
je pourrais le réparer comme ça, mais je me demande pourquoi il ne tirant la méthode before_save pour le test original.
Non, même erreur. Il attend "page-échantillon", mais obtient 010 –
La page exemple est-elle enregistrée dans la base de données de test lorsque vous exécutez le test? –
Hmm ok je pense que je vois le problème - ce n'est pas enregistrer parce que le permalien est vide (j'ai changé enregistrer pour enregistrer! Et il a jeté une erreur). La méthode before_save devrait corriger cela, cependant .. Je ne sais pas pourquoi before_save n'est pas appelé avant de l'enregistrer. –