2009-12-14 5 views
0

J'ai la routemodèle de routage Rails paramètre de méthode

map.member 'members/:id/:name_url', :controller => 'members', :action => 'show', :requirements => { :id => /\d+/ } 

et sur mon modèle membre j'ai une méthode name_url qui prend le nom et le convertit en minuscules et change des espaces pour tirets

le problème est que si je lance

link_to "Bill", member 

il me donne un « member_url n'a pas généré de » erreur

y a-t-il un moyen d'y parvenir? Je pensais une aide de vue qui a généré le lien, mais je ne pouvais pas accéder à ce à partir du contrôleur si je devais ...

Répondre

0

En supposant qu'il est l'action show du MembersController

class MembersController 

    def show 
    @member = Member.find_by_name("Bill") 
    end 

En app/views/members/show.html.erb , Vous souhaitez utiliser:

<%= link_to @member.name, member_path(@member, :name_url => "something") %> 
+0

oui, cela fonctionnera aussi, j'étais plus curieux de savoir s'il y avait encore un moyen de garder la syntaxe courte de: link_to « Bill », membre – Christopher

+0

Si la brièveté est la préoccupation, la création peut-être une fonction d'aide est le chemin à parcourir? dans la vue: <% = member_link @member%> dans le fichier d'aide: def member_link (membre) link_to member.name, member_path (membre,: name_url => member.name_url) extrémité –

0

le problème est le paramètre: name_url dans votre itinéraire:

map.member 'members/:id/:name_url', :controller => 'members', :action => 'show', :requirements => { :id => /\d+/ } 

Lorsque vous passez un objet ActiveRecord en tant qu'option pour url_for (ce que fait link_to), Rails appellera implicitement la méthode to_param du modèle. Lequel, sauf s'il est remplacé, renvoie uniquement l'identifiant. Vous pouvez remplacer to_param, mais cela ne vous donnera pas l'URL que vous voulez. Parce que to_param est utilisé pour créer la chaîne qui remplace l'identifiant dans les URL. Le mieux que vous pourriez faire avec un minimum de changements est de régler quelque chose comme ceci:

members/:id 

où: id est en fait :id-:name_url

vraiment la meilleure option est ce que suggère Dan McNevin. Toutefois, si c'est trop long pour vous, vous pouvez toujours faire une aide:

def link_to_member member 
    link_to member.name, member_url(member, :name_url => member.name) 
end 

et de l'utiliser à la place de link_to.

link_to "Bill", member =>link_to_member member

+0

Je vais l'ajouter à l'assistant d'application alors, le seul problème est que je ne peux pas accéder à cette aide du contrôleur ... ou puis-je? – Christopher

+0

Vous pouvez inclure les aides dans les contrôleurs dont vous avez besoin. Cependant, vous ne devriez pas utiliser link_to dans un contrôleur. – EmFi

+0

Je ne vais pas, j'essayais juste d'obtenir le chemin – Christopher