Путаница с вложенными маршрутами в Rails 3, в частности с автоматически сгенерированными путями - PullRequest
1 голос
/ 23 октября 2010

Для каждого вида у меня много наборов данных.Для каждого набора данных у меня есть много фенотипов.У наборов данных есть имена, которые в пределах вида являются первичными ключами.Виды также имеют строковые первичные ключи (например, Hs для Homo sapiens).Итак, я хочу иметь возможность указать фенотип следующим образом:

/species/Hs/mcgary/1

, где mcgary - имя (слаг) набора фенотипов.

Я понимаю, что могу получить этот видрезультата, добавив следующие строки в мой файл rout.rb:

match "/species/:species_id/:dataset(/:id/:action)" => 'phenotypes'
match "/species/:species_id/:dataset/:id" => 'phenotypes#show'

Phenotypes - это контроллер фенотипа.У Species есть контроллер, но у Dataset нет - его функции обрабатываются контроллерами Species и Phenotype.)

К сожалению, это не гарантирует, что пути будут работать, например, edit_species_dataset_phenotype_path.Я не совсем уверен, как написать эту инструкцию в rout.rb.Одна из возможностей состоит в том, чтобы иметь в дополнение к инструкциям по совпадению следующее:

resources :species do
  resources :dataset do
    resources :phenotypes
  end
end

и просто установить перенаправление.Но это неловко.Есть ли какой-нибудь способ, которым я могу использовать запись соответствия, чтобы заставить пути работать?Мне нравятся новые маршруты, но хотелось бы, чтобы в документации было несколько полных примеров.

Я также заметил, что если я сделаю что-то вроде edit_species_dataset_path (видами, набором данных), я смогу получить формат маршрута /species/:species_id/:phenotype_set_id - ноЯ не уверен, как заставить его использовать: abbrev вместо Species, за исключением того, чтобы каждый раз печатать видов.аббрев.Есть ли способ сказать ему, чтобы использовать этот столбец по умолчанию, а не идентификатор?

Большое спасибо.(И да, я понимаю, что такие вложенные маршруты становятся неловкими. Я в порядке.)

1 Ответ

1 голос
/ 26 октября 2010

Я нашел несовершенное решение, которое является опцией :path на resources().

resources :species do
  resources :datasets do
    resources :phenotypes, :path => ""
  end
end

Это дает мне небольшое изменение в маршрутах, которые я хотел, и три контроллера вместо двух,что не идеально, но важно, что это работает.

Мои пути теперь имеют вид / виды / Hs / наборы данных / mcgary / 1 (для фенотипа 1).

У меня также былонаписать несколько вспомогательных методов в ApplicationHelper.Это немного облегчает использование ресурсов с тройным вложением.

def phenotype_path(phenotype, dataset=nil, species=nil)
  dataset ||= phenotype.dataset
  species ||= phenotype.species
  File.join(phenotypes_path(dataset, species), phenotype.id.to_s)
end

def phenotypes_path(dataset, species=nil)
  species ||= dataset.species
  File.join(species_path(species.abbrev), "datasets", dataset.name)
end

def edit_phenotype_path(phenotype, dataset=nil, species=nil)
  File.join(phenotype_path(phenotype,dataset,species), "edit")
end

def new_phenotype_path(dataset, species=nil)
  File.join(phenotypes_path(dataset, species), "new")
end

alias :dataset_path :phenotypes_path

def edit_dataset_path(dataset, species=nil)
  File.join(dataset_path(dataset, species), "edit")
end

def dataset_path(dataset, species=nil)
  species ||= dataset.species
  File.join(species_path(species.abbrev), "datasets", dataset.name)
end

def datasets_path(species)
  species_datasets_path(species.abbrev)
end

К сожалению, иногда кажется, что эти пути конфликтуют с автоматически сгенерированными путями.Я не уверен, какой модуль содержит эти пути, поэтому их сложно переписать.

Другая проблема заключается в том, что я не могу понять, как сделатьpes_path (видов) и заставить его использовать аббревиатуру.Вместо этого мне нужно сделать видами_путь (видов.аббрев).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...