Формы для полиморфно связанных ресурсов, для которых отсутствует базовый путь к ресурсу "/ resource" - PullRequest
1 голос
/ 26 января 2011

У меня есть полиморфный ресурс 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. Это довольно легко обойти хотя. В любом случае я планировал переписать спецификацию представления сверху вниз.

...