2008-12-21 4 views
8

Comment puis-je obtenir la méthode to_param pour fournir des mots-clés en tout temps? J'ai du mal à obtenir à travailler avec cette voie:Overriding Rails to_param?

map.pike '/ vente /: auction_id/article /: id',: controller => 'éléments',: action => 'show'

Plus tôt, le to_param travaillait pour substituée

'articles/1-cachemire écharpe'

mais échoue avec 'auction/123/item/1'

Mise à jour:

Je ne suis pas si la syntaxe est correcte [(éditer: c'est correct: ça marche :-)], ou même efficace .... mais en utilisant haml, j'ai trouvé que le code suivant fonctionne pour générer le lien désiré ('auction /: auction_id/item /: id ')

- for auction in @auctions.sort{|a, b| a.scheduled_start <=> b.scheduled_start} 
    -for item in @items 
    - unless auction.current_auction 
     ... pike_path(auction.auction_id, item) 

Répondre

8

Je ne sais pas si je comprends votre question. (Il est 3:41 AM ici)

De ce que je vois, vous accédez directement à la méthode auction_id, au lieu d'utiliser pike_path(auction, item) qui utiliserait #to_param.

En outre, il peut échouer pour auction/123/item/1 car vous n'avez pas modifié votre contrôleur.

Je pense qu'il serait utile de décrire comment obtenir des limaces de travail. En règle générale, si vous remplacez #to_param, les ID ne fonctionnent plus. En général, si vous remplacez #to_param, les ID ne fonctionnent plus. Cela signifie que si vous utilisez des slugs, chaque fois qu'une URL polymorpique est générée (par exemple, link_to object, object), elle passe la valeur de to_param. Il est à noter que vous devez également changer votre contrôleur.

Personnellement, je pense que la meilleure façon de générer des limaces est facile à utiliser permalink_fu de techno-Weenie, ajoutant has_permalink à votre modèle, puis, passer outre to_param. Par exemple

class Auction < ActiveRecord::Base 
    has_permalink :title, :slug 
end 

en supposant que vous avez limace, un champ de chaîne, et que vous voulez slugize votre titre.

Vous devez également régler votre commande:

class AuctionsController < ApplicationController 
    def show 
    @auction = Auction.find_by_slug(params[:id]) || raise(ActiveRecord::RecordNotFound) 

    respond_to do |format| 
     format.html # show.html.erb 
    end 
end 

Ensuite, vous pouvez générer des itinéraires, des vues, de cette façon:

link_to @action, @action 

Par ailleurs, vous ne devriez pas trier vos actions dans la vue. Le meilleur moyen est d'utiliser named_scope.

+3

vous pouvez utiliser 'find_by_slug!' Qui déclenche une exception à moins que trouvé –