Rails form_for поставя препратка/адрес на обект в URL вместо в id

Ще отида и ще погледна източника, за да видя дали мога да намеря какво причинява това, но някой тук вероятно се е сблъсквал с това преди, така че... правя нормален 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...“ с нула. - person Benjamin Manns; 24.02.2010