map.resources с альтернативным первичным ключом (ы)

StackOverflow https://stackoverflow.com/questions/3143185

  •  01-10-2019
  •  | 
  •  

Вопрос

У меня есть модель рельсов Object У этого нет столбца ID. Вместо этого он использует кортеж первичных клавиш из двух других моделей в качестве основного ключа, dependency_id а также user_id.

Что я хочу сделать, это уметь сделать что-то вроде этого в routes.rb:

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

И для него волшебным образом генерировать URL-адресов, как это:

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

... За исключением того, что я только что сделал это, и такого синтаксиса нет.

Есть ли способ настроить map.resources Так что я могу получить спокойные URL, без необходимости делать пользовательские маршруты для всего? Или я только что прикручивался за то, что не подписался на удостоверение личности?

То :path_prefix вариант выглядит несколько перспективным, однако мне все равно нужен способ удалить id часть URL. И я бы хотел, чтобы все еще могли использовать помощники пути, если это возможно.

Это было полезно?

Решение

Вы должны переопределить Object Метод модели to_param отразить ваш основной ключ. Что-то вроде этого:

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

Затем, когда вы будете установить URL для этих объектов (например object_path(some_object)) он автоматически превращается в что-то вроде /objects/5-3. Отказ Тогда в шоу действия вам придется разделить params[:id] На тире и найдите объект по зависимости_id и 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

Вы также можете посмотреть на find_by_param GEM для рельсов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top