2009-12-14 5 views
0

J'essaye de configurer des routes dnamic dans mon application de rails.faire des routes dynamiques à partir du contenu

dire

J'ai un modèle qui a agit un attribut de nom.

nom: chaîne.

Ce que j'essaye de faire est d'utiliser ce nom comme mon URL.

dans mon itinéraire si ont

map.connect 'blacktie/:id', :controller => 'acts', :action => 'show', :id => 3 

Cela me prend à http://0.0.0.0:3000/blacktie

Je sais que je peux faire quelque chose le long des lignes de

def map.controller_actions(controller, actions) 
actions.each do |action| 
    self.send("#{controller}_#{action}", "#{controller}/#{action}", :controller => controller, :action => action) 
end 

pas sûr si elle est même possible.

Répondre

1

Ajouter ce qui suit au bas de votre config/routes.rb

map.connect '*url', :controller => 'acts', :action => 'show_page' 

Définissez ensuite les éléments suivants dans app/controllers/acts_controller.rb

def show_page 
    url = params[:url] 
    if Array === url 
    url = url.join('/') 
    else 
    url = url.to_s 
    end 

    # you now have the path in url 
    @act = Acts.find_by_name(url) 

    if @act 
    render :action => :show 
    else 
    redirect_to some_error_page, :status => 404 
    end 
end 

Quelques avertissements relatifs à l'approche ci-dessus.

  1. La route est un attrape-tout. Vous piégerez tout ce qui ne correspond pas à un itinéraire au-dessus. Alors assurez-vous que c'est la dernière et assurez-vous que vous êtes prêt à gérer les 404 et autres.
  2. Le paramètre :url param est un tableau ou une chaîne en fonction de l'itinéraire entrant. Par exemple /blacktie/night sera un tableau avec une valeur de ['blacktie', 'night']. C'est pourquoi je les ai rejoints au début de show_page. Donc, votre fonction find_by_name pourrait être très intelligente et permettre des actes imbriqués et le tel.

Espérons que cela aide.

OU ...

Ajouter ce aux routes (en bas):

map.connect ':name', :controller => "acts", :action => "show_page", 
      :requirements => {:name => /[\w|-]*/} 

Cela dit rails d'envoyer quoi que ce soit correspondant aux exigences de votre gestionnaire. Ainsi, votre show_page serait comme suit:

def show_page 
    @act = Acts.find_by_name(params[:name]) 

    if @act 
    render :action => :show 
    else 
    redirect_to some_error_page, :status => 404 
    end 
end 

Cela se débarrasse de quelques-uns des gotchas mais vous donne moins d'options pour la nidification et autres.

Questions connexes