Пожалуйста, помогите с этим бета-кодом, как я могу это исправить?

Возможный дубликат:
Почему Этот код дает желаемый результат?

У меня есть код:

def check_beta_code
    beta_code_array = ['AAAAAAAAAA', 'BBBBBBBBBB', 'CCCCCCCCCC', 'DDDDDDDDDD', 'EEEEEEEEEE']
    beta_code_array.each do |code|
        if :beta_code != code
            errors.add(:beta_code, "Invalid Beta Code")
        end
    end 
end

Проблема с этим кодом заключается в том, что даже если кто-то вводит правильный пароль, все равно генерируются 4 ошибки, потому что остальные 4 неверны.


person Vasseurth    schedule 13.07.2011    source источник
comment
Предположительно, вы хотите вернуться без ошибки, если код совпадает. Если это так, вы должны вернуться, если есть совпадение, и потерпеть неудачу, если вы окажетесь ниже цикла.   -  person drekka    schedule 13.07.2011


Ответы (2)


Я предполагаю, что этот код находится где-то в модели. Вы можете попробовать создать модель, которая содержит бета-коды и хранить некоторые значения в БД. Затем нужно просто запросить код в БД и посмотреть, есть ли совпадение:

# model
class BetaCode < ActiveRecord::Base
  # assumes a field named 'code'
end

# add some codes (via migration, console, manually, etc)
['AAAAAAAAAA', 'BBBBBBBBBB', 'CCCCCCCCCC', 'DDDDDDDDDD', 'EEEEEEEEEE'].each do |code|
  BetaCode.create(:code => code )
end

# and check for a match when user submits code (controller)
@code = BetaCode.find_by_code(user_code)

if @code.present?
  # user is approved
else
  # sorry, no luck
end

Если вы хотите использовать свой фрагмент, вы всегда можете использовать метод member? для массива.

person sa125    schedule 13.07.2011
comment
Спасибо, я использовал это, но внутри нашел includes? - person Vasseurth; 13.07.2011

Похоже, вы просто хотите увидеть, содержит ли массив определенный код, поэтому вам следует использовать метод find_index. Он возвращает индекс элемента, который вы ищете, или nil, если элемент не может быть найден (это тот случай, который нас интересует).

def check_beta_code(code)
    beta_code_array = ['AAAAAAAAAA', 'BBBBBBBBBB', 'CCCCCCCCCC', 'DDDDDDDDDD', 'EEEEEEEEEE']
    return beta_code_array.find_index(code) != nil
end

check_beta_code 'foobar' # false
check_beta_code 'AAAAAAAAAA' # true
person zneak    schedule 13.07.2011
comment
` def check_beta_code errors.add(:beta_code, Invalid Beta Code) if !(corect_code?(:beta_code)) end def correct_code?(code) beta_code_array = ['AAAAAAAAAA', 'BBBBBBBBBB', 'CCCCCCCCCC', 'DDDDDDDDDD', 'EEEEEEEEEE'] return beta_code_array.find_index(code) end end` Будет ли это работать? - person Vasseurth; 13.07.2011
comment
@Planetpluto, я полагаю, да. Вы должны проверить себя, хотя. - person zneak; 13.07.2011