Rails form_for помещает ссылку/адрес объекта в URL вместо идентификатора

Я собираюсь пойти и посмотреть на источник, чтобы увидеть, могу ли я найти причину этого, но кто-то здесь, вероятно, сталкивался с этим раньше, поэтому... Я делаю обычный form_for:

<% form_for(@myobj) do |f| %>

Но URL-адрес, который он генерирует:

form action="/myobjs/%23%3CMyobj:0x105f03ec0%3E" class="edit_myobj" id="edit_myobj_13" method="post">

Когда он, конечно, должен генерировать действие «/myobjs/13», если id==13. Я проверил, что объект правильно возвращает свой идентификатор, и, конечно, form_for фактически устанавливает идентификатор формы соответствующим образом, используя идентификатор (как показано выше), поэтому... я еще не уверен, что form_for использует для создания действия URL для формы. Кто-нибудь сталкивался с этим раньше и имел решение?

Заранее спасибо...


person Masonoise    schedule 22.02.2010    source источник


Ответы (2)


У вас есть настройки маршрутов для модели?

person Toby Hede    schedule 22.02.2010
comment
Да, извините, я должен был включить это изначально. Стандартная маршрутизация RESTful: map.resources :myobjs - person Masonoise; 24.02.2010

У меня такое случалось только при попытке создать форму для нового объекта, например <% form_for(Widget.new) do |f| %>. Попробуйте переопределить метод to_param в своей модели, чтобы увидеть, сможете ли вы найти что происходит.

def to_param
  (id = self.id) ? id.to_s : 'NO ID FOUND! Dig for bugs!'
end

Поскольку вы не наследуете ActiveRecord::Base, вам придется реализовать to_param самостоятельно. Исходный код to_param ActiveRecord выглядит следующим образом:

def to_param
  # We can't use alias_method here, because method 'id' optimizes itself on the fly.
  (id = self.id) ? id.to_s : nil # Be sure to stringify the id for routes
end

И должно работать в вашей ситуации.

person Benjamin Manns    schedule 23.02.2010
comment
Спасибо за эту мысль, я еще не дошел до этого. Как ни странно, если у меня есть to_param(), как показано здесь, действие генерируется правильно с action=/myobjs/13. Если я закомментирую метод to_param(), он снова сгенерируется неправильно. Странно, у меня такого раньше не было. Мне придется исследовать, как to_param() выглядит в других моих моделях и суперклассах - это не модель ActiveRecord, поэтому ее супер - это просто Object... - person Masonoise; 24.02.2010
comment
ActiveRecord::Base — это место, где определен to_param, поэтому Object не будет генерировать метод. Чтобы исправить ошибку, вам придется либо наследовать ActiveRecord::Base, либо добавить to_param вручную. Просто замените 'NO ID FOUND...' на nil. - person Benjamin Manns; 24.02.2010