воскресенье, 7 сентября 2008 г.

Грабли

Пока пишу натыкался на следующие грабли.
Вообще процесс отладки пока довольно непонятно как организовать - очевидно, ляпы в модели надо юнит-тестами долбить, а в контроллере?

- несмотря на десять предупреждений в agive web development with rails я умудрился вставить метод в контроллер после private. Типа

class MyController < ApplicationController
@photos = Photo.all
end

private
def some_inner_magick
#...
end

def new
@photo = Photo.new
end
end

Естественно, метод new при такм раскладе не будет доступен для веб-запроса типа localhost/my/new, но прямо этого не скажет:)
Вывод: когда собираешься сделать private-метод, писать всегда после него public. Убрать никогда не поздно:
private
def some_inner_magick
#...
end
public

def new
@photo = Photo.new
end
Вторые грабли - руби настолько динамический язык, что может переопределять методы хоть каждую строчку. И слова не скажет, пока ты будешь биться, правя первый из них, который "не работает":

def added_track
@track = Track.from_upload(params[:upload])

if @track
@track.save!
else
flash[:notice] = "Track could not be read!"
redirect_to :action => 'add_track'
end
end

# some stuff...

def added_track
# old stub
end

Еще одна "проблема" была в том, что ActiveRecord хоть и умен, но связь belongs_to все же надо указать и в миграции (например, t.references :track). Впрочем, тут сообщение об ошибке довольно информативно - видно, что в связанном запросе не хватает поля track_id. Долго искал, нормальное ли это поведение - указывать руками связь. Ленивый стал, всё хочу чтобы мне script/generate само.

Комментариев нет: