форма с CheckboxSelectMultiple не проверяет

Оператор in работает только с объектами.

могут быть данными, которые вы отправляете, нуждаются в разборе (то есть в строковом формате json).

попробуйте проанализировать ваши данные JSON.parse(data)

$.each(JSON.parse(data), function(index, element){...})

19
задан Jeff Bauer 17 September 2013 в 14:44
поделиться

2 ответа

Вам не нужен 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

Конечно, в производственном коде вы можете на самом деле назвать эти классы, генерируя определение константы. на основе переданного имени, для лучшего сообщения об ошибках.

30
ответ дан 30 November 2019 в 03:43
поделиться

Пусть это будет полезно для вас

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')
5
ответ дан 30 November 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: