2009-09-09 6 views
0

J'ai en fait deux questions. J'ai lu le guide des Rails et quelques autres articles, mais je n'ai pas été capable de traduire ce que j'ai lu en itinéraires de travail. J'ai une application qui permet le téléchargement d'images de plusieurs contextes différents. Je voudrais l'URI pour exprimer le contexte afin que les URIs suivantes accèdent à la même page:Comprendre les routes dans les rails

/images/upload 
/photos/upload 

Dans cet exemple, j'ai surchargé l'new_image_path à utiliser upload à des fins descriptives. J'ai l'override de travail, mais en utilisant :as pour mapper des images aux photos ne semble fonctionner que dans un sens (avec :as => 'photos' en place, les routes ne fonctionnent pas). Existe-t-il un moyen de faire pointer plusieurs itinéraires vers le même endroit? J'ai également plusieurs façons de télécharger des images/photos/etc. La méthode standard avec une seule image par formulaire ou une méthode par lots où l'utilisateur télécharge un fichier zip et cette archive est extraite et chacune de ses images est enregistrée.

Il semble que la manière la plus sémantique de le faire consiste à ajouter un composant gestionnaire à l'URI (par exemple /images/upload/batch), mais je ne suis pas sûr de savoir comment gérer cela. Le chemin de routage par défaut semble assez général pour quelque chose qui ne serait requis que pour les images, mais je ne veux pas non plus être aussi spécifique avec un chemin nommé pour tout le bit. Quelle est la meilleure façon de faire quelque chose comme ça?

Merci.

Mise à jour: Sur la base de la réponse de jonnii à ma première question, je l'ai ajouté ce qui suit à mon dossier routes.rb:

map.resources :images, :path_names => { :new => 'upload' } 
map.resources :photos, :controller => 'Images', :path_names => { :new => 'upload' } 

Cela semble faire l'affaire pour me permettre d'utiliser /images/ et /photos/ de manière interchangeable.

+0

Voir le 'routes.rb' que vous avez déjà aiderait à diagnostiquer. Je recommande également l'utilisation généreuse de 'rake routes' lorsque vous apportez des modifications. –

Répondre

1

Je suppose que vous faites des itinéraires vos photos en utilisant les ressources:

map.resources :photos 

Si tel est le cas, vous devriez être en mesure de définir une deuxième ressource pointant vers le même contrôleur que la ressource de photos:

map.resources :uploads, :controller => 'PhotosController' 

Je n'ai pas testé, mais je ne vois pas pourquoi quelque chose comme ça ne marcherait pas ..


Question 2:

Il y a plusieurs façons de faire des téléchargements par lots, je pense que le meilleur moyen est d'avoir une ressource séparée car vous aurez probablement une interface utilisateur différente pour cela. Par exemple vous pourriez faire:

map.resources :batch_uploads 

Cela serait probablement suffisant si vous alliez prendre des téléchargements par lots comme un zip.

Une option un peu plus compliquée mais qui tire parti des finesses des rails (et qui est honnête, qui ne veut pas en profiter?) Est quelque chose avec des formes enfants imbriquées et accepts_nested_attributes_for. Cela serait utile si vous vouliez autoriser un utilisateur à attacher plus d'une image à un formulaire à la fois.

Par exemple, si votre modèle était quelque chose comme:

class User < AR:B 
    has_many :photos 
end 

Vous pourriez avoir une route comme:

map.resources :users do |u| 
    u.resources :photos, :collection => {:get => :new_batch, :post => create_batch} 
end 

Dans votre vue new_batch vous auriez un form_for @user avec un user_form.fields_for :photos. Vous pouvez ajouter un nouveau formulaire en utilisant ajax, peu importe et poster tout à la fois.

Si vous souhaitez conserver la même sémantique que vous avez maintenant et que vous ne souhaitez plus ajouter d'itinéraires, vous pouvez étendre votre modèle pour faire quelque chose de différent en fonction du nom de fichier de ce qui est téléchargé.

Par exemple, si vous utilisez des pièces jointes paperclip vous pouvez arrêter le traitement de la pièce jointe si le nom du fichier se termine par .zip (ce code est pas garanti, je fais de la mémoire):

def is_zip? 
    attachment.filename.ends_with?('.zip') 
end 

before_attachment_process do |attachment| 
    false if is_zip? 
end 

before_filter :process_bulk_attachment, :if => :is_zip? 
def process_bulk_attachment 
    ... extract the zip and save each image in it ... 
    false 
end 

La beauté de ceci est que cela fait partie du modèle. Vous devriez toujours viser des modèles gros et des contrôleurs maigres! J'espère que cela vous donnera quelques idées et/ou vous oriente dans la bonne direction.

+0

Vous avez raison et cela m'a complètement manqué dans le guide des Rails. Enfer, l'exemple du guide est même celui dont j'ai besoin. J'ai marqué votre réponse, mais je ne veux pas la marquer avant que la deuxième question ne soit résolue. Vraiment apprécier votre aide avec le premier. J'ai mis à jour ma question initiale sur la façon dont j'ai appliqué votre réponse. –

+0

C'était une jument totale à taper =) J'espère que c'est utile !! – jonnii

+0

Wow. C'est énormément de code pour ce qui semble être une opération simple (j'apprécie l'effort, cependant :-). Tout ce que je veux vraiment, c'est pouvoir appeler/images/upload/batch et avoir cet appel à ImagesController :: new avec un paramètre "batch" que je peux transférer pour que je puisse légèrement modifier le formulaire par défaut partiel. Y a-t-il un moyen plus facile que cela? –

0

Je suis devenu un peu plus près de ce que je vais pour:

map.resources :images, :path_names => { :new => 'upload' } 
map.resources :images, :new => { :batch => :get } 

L'ancien me permet d'utiliser /images/upload au lieu de /images/new, comme le montre la réponse de jonnii à ma première question. Ce dernier me permet de spécifier une deuxième route à la "nouvelle" fonctionnalité via /images/new/batch qui appelle ImagesController#batch. J'espérais être en mesure d'utiliser /images/upload/batch, mais cela peut avoir à faire.

De toute évidence, j'ai encore un long chemin à parcourir avant de vraiment comprendre le routage dans Rails. jonnii, si je ne fais que répéter une partie de ce que vous avez déjà dit, je m'en excuse. Je peux avoir à plaider l'ignorance en ce qui concerne une grande partie de votre réponse à la question 2.