2009-03-23 6 views
4

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.

Répondre

2

D'accord, j'ai été capable de comprendre. Je devais utiliser before_validation comme rappel et non before_save

0

Cela fonctionne-t-il si vous supprimez la clé vide permalink: de votre fichier pages.yml?

+0

Non, même erreur. Il attend "page-échantillon", mais obtient 010 –

+0

La page exemple est-elle enregistrée dans la base de données de test lorsque vous exécutez le test? –

+0

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. –

Questions connexes