Question

J'ai un modèle Rails Object qui ne dispose pas d'une colonne d'identité. Il utilise plutôt un tuple de clés primaires de deux autres modèles comme la clé primaire, dependency_id et user_id.

Ce que je veux faire est d'être en mesure de faire quelque chose comme ça dans routes.rb:

map.resources :object, :primary_key => [:dependency_id, :user_id]

Et pour de générer par magie URL comme ceci:

/objects/:dependency_id/:user_id
/objects/:dependency_id/:user_id/1
/objects/:dependency_id/:user_id/1/edit

... Sauf que je viens de faire ça, et il n'y a pas de syntaxe.

Y at-il un moyen de personnaliser map.resources afin que je puisse obtenir les URL RESTful, sans avoir à faire des itinéraires personnalisés pour tout? Ou suis-je juste foiré pour ne pas suivre la convention d'identité?

L'option :path_prefix ressemble quelque peu prometteuse, mais je voudrais encore besoin d'un moyen de supprimer la partie id de l'URL. Et je voudrais être encore en mesure d'utiliser les aides de chemin si possible.

Était-ce utile?

La solution

Vous devriez remplacer la méthode de modèle Object de to_param pour refléter votre clé primaire. Quelque chose comme ceci:

def to_param
  [dependency_id, user_id].join('-')
end

Ensuite, lorsque vous installerez urls pour ces objets (comme object_path(some_object)), il est automatiquement converti en quelque chose comme /objects/5-3. Puis, en action show que vous auriez à diviser le tableau de bord et sur params[:id] de trouver l'objet par dependency_id et user_id:

def show
  dep_id, u_id = params[:id].split('-').collect(&:to_i)
  object = Object.find_by_dependency_id_and_user_id(dep_id, u_id)
end

Vous pouvez également consulter find_by_param bijou pour rails .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top