36 votes

Rails slugs in URL - utilisation du titre de l'enregistrement au lieu de l'ID

J'ai essayé de faire de mon rails de créer des Url afficher les enregistrements en utilisant leur titre au lieu de leur ID dans l'URL de la forme:

/posts/un-poste-sur-roquettes

À la suite d'un tutoriel en ligne je n'ai suivantes:


Parce que l'ID n'est plus dans l'URL, il faut modifier un peu le code.

class Post < ActiveRecord::Base
  before_create :create_slug

  def to_param
    slug
  end

  def create_slug
    self.slug = self.title.parameterize
  end
end

Lorsqu'un poste est créé, l'URL de la version imprimée du titre est stocké dans la base de données, dans la colonne slug. Nous avons également de mettre à jour les trouvailles pour rechercher des enregistrements à l'aide de la colonne slug au lieu de l'aide de l'ID.

class ProjectsController < ApplicationController
  def show
    @project = Project.find_by_slug!(params[:id])
  end
end


À ce stade, il semble fonctionner sauf montrant un dossier, car find_by_slug! n'existent pas encore. Je suis d'une extrême newb - où dois-je être le définir?

19voto

deadwards Points 592

Ce n'est pas nécessairement une réponse directe à votre question, mais avez-vous regardé le Stringex plugin (http://github.com/rsl/stringex)? C'est un excellent moyen de s'auto-créer des limaces pour vos dossiers.

Vous pouvez simplement ajouter quelque chose comme ce qui suit à votre modèle:

class Post < ActiveRecord::Base
  acts_as_url :title
end

et il va créer automatiquement les limaces de votre titre et de l'enregistrer dans la colonne slug.

Il est également très intelligent sur la façon dont il crée les limaces. Par exemple, un titre de "rabais de 10%, aujourd'hui, seuls" est transformé en "10% off aujourd'hui-seulement".

Jolie nappe!

13voto

jdl Points 12272

find_by_foo n'est pas quelque chose que vous devez définir. ActiveRecord en prendra pour vous, tant que vous avez une colonne nommée "foo". Ajouter un point d'exclamation comme vous l'avez fait provoquera la levée d'une exception si aucun enregistrement n'est trouvé, au lieu de renvoyer nil sans exception si vous n'utilisez pas le point d'exclamation.

En ce qui concerne votre problème spécifique, vous avez ajouté votre slug à Post, mais vous essayez d'effectuer une recherche sur Project.

2voto

ereslibre Points 129

Stringex bijou est idéal pour générer de la chute elle-même, mais je n'accepte pas que l'enregistrement dans la base de données est une bonne idée. Vous devez vous rappeler que si quelque chose de pertinent à la chute des modifications, vous devez mettre à jour votre slug colonne. E uniforme.

En fin de compte, c'est la duplication des informations, peu importe sous quelle forme. J'ai écrit un post justement à cause de cette raison.

http://blog.ereslibre.es/?p=343

J'espère que le post est de peu d'aide. J'ai essayé d'expliquer tout ce qu'il ya.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X