Оператор in
работает только с объектами.
могут быть данными, которые вы отправляете, нуждаются в разборе (то есть в строковом формате json).
попробуйте проанализировать ваши данные JSON.parse(data)
$.each(JSON.parse(data), function(index, element){...})
Вам не нужен LogFileReaderFactory; просто научите свой класс LogFileReader создавать экземпляры своих подклассов:
class LogFileReader
def self.create type
case type
when :git
GitLogFileReader.new
when :bzr
BzrLogFileReader.new
else
raise "Bad log file type: #{type}"
end
end
end
class GitLogFileReader < LogFileReader
def display
puts "I'm a git log file reader!"
end
end
class BzrLogFileReader < LogFileReader
def display
puts "A bzr log file reader..."
end
end
Как видите, суперкласс может действовать как собственная фабрика. А как насчет автоматической регистрации? Ну, почему бы нам не сохранить хэш наших зарегистрированных подклассов и зарегистрировать каждый из них, когда мы определим их:
class LogFileReader
@@subclasses = { }
def self.create type
c = @@subclasses[type]
if c
c.new
else
raise "Bad log file type: #{type}"
end
end
def self.register_reader name
@@subclasses[name] = self
end
end
class GitLogFileReader < LogFileReader
def display
puts "I'm a git log file reader!"
end
register_reader :git
end
class BzrLogFileReader < LogFileReader
def display
puts "A bzr log file reader..."
end
register_reader :bzr
end
LogFileReader.create(:git).display
LogFileReader.create(:bzr).display
class SvnLogFileReader < LogFileReader
def display
puts "Subersion reader, at your service."
end
register_reader :svn
end
LogFileReader.create(:svn).display
И вот, у вас это есть. Просто разбейте это на несколько файлов и потребуйте их соответствующим образом.
Вы должны прочитать Шаблоны проектирования Питера Норвига на динамических языках , если вы заинтересованы в подобных вещах. Он демонстрирует, сколько шаблонов дизайна фактически работают вокруг ограничений или несоответствий в вашем языке программирования; и с достаточно мощным и гибким языком вам не нужен шаблон проектирования, Вы просто реализуете то, что хотите сделать. Он использует Дилана и Common Lisp в качестве примеров, но многие из его пунктов также имеют отношение к Ruby.
Возможно, вы также захотите взглянуть на Почему Poignant Guide to Ruby , особенно в главах 5 и 6 хотя, только если вы можете иметь дело с сюрреалистическим техническим письмом.
edit : Вычеркнуть ответ Йорга сейчас; Мне нравится уменьшать повторения, и поэтому не повторять название системы контроля версий как в классе, так и при регистрации. Добавление следующего к моему второму примеру позволит вам писать намного более простые определения классов, в то же время все еще будучи довольно простым и понятным.
def log_file_reader name, superclass=LogFileReader, &block
Class.new(superclass, &block).register_reader(name)
end
log_file_reader :git do
def display
puts "I'm a git log file reader!"
end
end
log_file_reader :bzr do
def display
puts "A bzr log file reader..."
end
end
Конечно, в производственном коде вы можете на самом деле назвать эти классы, генерируя определение константы. на основе переданного имени, для лучшего сообщения об ошибках.
Пусть это будет полезно для вас
num_choices = ( ("1", "ONE"), ("2", "TWO"), ("3", "Three"), ("4", "Four"))
num_list = forms.MultipleChoiceField(choices=num_choices, required=True, widget=forms.CheckboxSelectMultiple(), label='Select No', initial=("1", "2"))
Если вы хотите передать объект ORM напрямую, вы можете попробовать следующее
num_list = forms.ModelMultipleChoiceField(Numbers.objects.all(), required=True, widget=forms.CheckboxSelectMultiple(), label='Select No')