- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
def set_path
if name && (!path || path == "/")
self.path = self.parent.present? ? "#{self.parent.path}/#{name}" : "/#{name}"
elsif !new_record? && name && path && name_was != name
parts = path.split("/")
parts.pop
self.path = [parts.join("/"), name].join("/")
elsif !new_record? && name && self.parent_id_changed?
self.path = self.parent.present? ? "#{self.parent.path}/#{name}" : "/#{name}"
elsif new_record? && name && path
self.path = [path, name].join("/")
end
if path && self.parent.blank?
parts = path.split("/")
self.name = parts.pop
parent_path = parts.join("/")
if parent_path.blank? || parent_path == "/"
self.parent = nil
else
possible_parent = site.asset_folders.find_by_path(parent_path)
self.parent = possible_parent.present? ? possible_parent : self.class.create(path: parent_path, site: site)
end
end
true
end
Как не нужно работать с путями в Rails-приложении. Это и еще примерно 500 строк было заменено на 11 строк кода, включая пустые.
кто писал?
пхпшник?
Там была очень, очень плохая эмуляция древовидной файловой системы на Ruby — вся работа с путями выглядела вот так и работала иногда — плюс раздача статики, где каждый хит проходил через базу данных, которую я заменил на одну функцию, собирающую дерево из симлинков, и nginx.
Из не попавшего в фрагмент: например, сломанная эмуляция транзакций при помощи поля в базе и исключений. При том, что можно было просто взять и написать транзакцию *facepalm
Я это к чему - там тоже 1000-строковые модели легко (если поймёшь что они делать должны:)) сокращаются до 30-50 строк включая добавление DOC-комментов.
Эксперт по разработке хеш-таблиц