map.resources с альтернативным первичным ключом (ы)
-
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 для рельсов.