map.resources с альтернативным первичным ключом (ами) - PullRequest
1 голос
/ 29 июня 2010

У меня есть модель Rails 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-адреса RESTful без необходимости настраивать маршруты для всего?Или я просто облажался за несоблюдение соглашения об идентификаторах?

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

1 Ответ

2 голосов
/ 29 июня 2010

Вы должны переопределить Object метод модели to_param, чтобы отразить ваш первичный ключ.Примерно так:

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

Затем, когда вы будете устанавливать URL-адреса для этих объектов (например, object_path(some_object)), они автоматически преобразуются во что-то вроде /objects/5-3.Затем в действии show вам придется разделить 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 для рельсов .

...