2010-06-29 2 views
1

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

То, что я хочу сделать, это быть в состоянии сделать что-то подобное в 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, без необходимости настраивать маршруты для всего? Или я просто привинчен к тому, чтобы не следовать конвенции ID?

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

ответ

2

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

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

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

+0

Звучит многообещающе. Я отдам его. – Karl

+0

Это отлично работает. К сожалению, '/' не является полезным разделителем, но тире тоже неплохо. Спасибо за помощь! – Karl

Смежные вопросы