Является ли эта проверка почти правильной? - PullRequest
0 голосов
/ 03 декабря 2011

У меня есть форма, которую учащиеся используют для оценки 6 классов от 1 до 6. Если они выбирают математику как «1» (самая сложная), то я не хочу, чтобы они могли выбирать другой предмет как самый сложный. , Форма, очевидно, даст им возможность выбрать «1» для каждого предмета, но я хочу использовать проверки для защиты от отправки формы, которая не следует инструкциям

Это фрагмент из формы

<div class="field">
    <%= f.label(:math, "Mathp") %>
    <%= f.select:math, 1..6 %> </br>
    </div>

<div class="field">
    <%= f.label(:french, "French") %>
    <%= f.select:french, 1..6 %> </br>
    </div>

Я собирался использовать такой метод проверки, но я не думаю, что логика его работает (т.е. он не защищает от всех возможных ситуаций), и, вероятно, это тоже дерьмовый (нефункциональный) код, потому что я только учусь кодировать (на самом деле я уже давно терплю неудачу). Можете ли вы предложить улучшения?

validates :rank_favorites 


...

def rank_favorites

unless :math != :french && :french != :history && :history != :spanish && :spanish != :art && :art != :physed return false

end

Ответы [ 3 ]

3 голосов
/ 03 декабря 2011

Ваш rank_favorites, к сожалению, далеко, но невежество можно исправить с помощью обучения. Вы просто сравниваете кучу символов, и это не делает ничего полезного (по крайней мере, не настолько, насколько вам это нужно), вы проверяете, сводится к следующему:

unless false && false && false && false && false return false

, что эквивалентно:

unless false return false

Возможно, вы захотите использовать validate :rank_favorites (не validates), и ваш валидатор добавит сообщения об ошибках вместо простого возврата логического значения:

validate :rank_favorites

#...

def rank_favorites
  ranks = [math, french, history, spanish, art, physed]
  if(ranks.include?(nil))
    errors[:base] << 'Rank all of them you lazy person!'
  elsif(ranks.uniq.length != ranks.length)
    errors[:base] << 'You fail at ranking, no duplicates allowed.'
  end
end

Метод Array#uniq создаст копию вашего массива с удаленными дубликатами, если длины не совпадают, то что-то было удалено, и у вас были повторяющиеся записи.

Возможно, вы захотите потратить некоторое время на чтение руководства по валидации:

Проверка активной записи и обратные вызовы

1 голос
/ 03 декабря 2011

так что вы действительно хотите, чтобы убедиться, что ни один предмет не получает такой же рейтинг:)

:math != :french # => true ALWAYS because they internalized constant strings which are obviously different

Если вы сделали ..

self.math != self.french # => this is comparing variables now. much better. BUT Still wrong in terms of the logic you want

Как насчет

if [self.math,self.french,self.history,self.spanish,self.art,self.physed].uniq.sort != [1,2,3,4,5,6])
  errors.add(:base,"Repeated rankings")
end
1 голос
/ 03 декабря 2011

Вы всегда можете сделать что-то вроде этого:

validate do
  unless [math, french, history, spanish, art, physed].uniq.length == 6
    errors.add(:base, :doh_theyre_not_unique_error)
  end
end

Это действительно похоже на то, что он может использовать какую-то форму любви JS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...