У меня есть полиморфный ресурс Location
, который может привязываться, скажем, к экземплярам Store
. Степень, в которой это «должно» быть полиморфным ресурсом, сомнительна, но это не имеет значения в настоящий момент.
Местоположение получает доступ к своему полиморфному родителю через location.locatable
.
Поскольку местоположение всегда будет дочерним для ресурса, такого как магазин, я хотел бы удалить маршрут к POST /locations
и вместо этого иметь прямые запросы POST приложения к /stores/1/locations
.
Теперь метод Rails по умолчанию, когда речь идет о полиморфных ассоциациях, заключается в том, чтобы делать это на уровне контроллера с
def new
@location = Store.find(params[:store_id]).vendors.new
end
Это, как и ожидалось, заполняет location.locatable_id
и location.locatable_type
. Замечательно. Но он по-прежнему направляется к locations_path
по умолчанию, от которого я хотел бы избавиться.
И я пытаюсь, это поднимает ошибку маршрута не найдено.
Так, как я могу подготовить общую location
форму, которую можно распространить на новых родителей?
Я пришел к следующему:
form_for(@location, :url => [@location.locatable, @location]) do |l|
Что, кажется, работает нормально, но передача пути в виде массива раздражает меня, и по какой-то причине я не могу найти документацию по этому вопросу. Есть ли лучший способ сделать это? Я новичок в полиморфных ресурсах, и было бы неплохо сделать это с самого начала.
Кроме того, (весьма) незначительная периферийная проблема заключается в том, что она не взаимодействует сразу после установки со стандартной сгенерированной RSpec спецификацией представления, поскольку Rails фактически пытается найти @location.locatable
. Это довольно легко обойти хотя. В любом случае я планировал переписать спецификацию представления сверху вниз.