2012-02-15 2 views
2

У меня есть форма, в которой пользователь ('member') отправляет 4-значный вывод, который затем сохраняется в переменной сеанса с именем :submitted_pin. По какой-то причине быстрое выполнение if/else не работает должным образом, и я предполагаю, что это глупая ошибка с моей стороны, но если вы захотите взглянуть, я бы очень признателен!Ruby on Rails - проверка соответствия данных формы данных базы данных

Посмотреть

<%= form_for :member_pin, :url => { :action => "verify_pin", :id => member.id } do |f| %>` 
    <%= f.label :pin %> 
    <%= f.text_field :pin %> 
<%= f.submit 'Submit' %> 

Контроллер

Перед фильтр

before_filter :validate_pin, :only => :show 

действий (POST Route)

def verify_pin 
    @member = Member.find(params[:id]) 

    session[:submitted_pin] = params[:member_pin][:pin] 
    redirect_to @member 
end 

Фильтр

def validate_pin 
    @member = Member.find(params[:id]) 
    @member_pin = @member.pin 

    if session[:submitted_pin] == @member_pin 
    render @member 
    else 
    redirect_to '/' 
    end 
end 

И результат всего этого не редирект на мой root_url независимо от того, что, даже если Pin введен делает соответствует булавку в базе данных для этого пользователя , Помогите! Спасибо :)

+0

В вашем методе 'validate_pin', прямо над вашим оператором if, добавьте эту строку:' raise '# {@ member_pin} == # {session [: submitted_pin]}: # {@ member_pin == session [: submitted_pin] } ", и это даст вам три части данных: переменную сеанса submit_pin, как понимается Rails, member.pin, как понято Rails, и их эквивалентность. Если бы мне пришлось рисковать догадаться от старта, я бы поспорил, что это строка, а другая - целое число - это все время затмевает меня. –

+0

Большое вам спасибо за ваш ответ. Похоже, вы правы ... одна должна быть строкой, а одна должна быть целым числом. Это то, что я получаю от метода 'raise', который вы написали мне! '5555 == 5555: false' - Как мне перейти на преобразование' to_i' или 'to_s' в мой код, который я представил в моем вопросе? – briankulp

+0

Отлично! Здесь есть несколько способов: проще всего установить '.to_i' на каждом из элементов, которые вы сравниваете, таким образом вам не нужно заботиться о том, что именно. Другим методом было бы использовать '.inspect' или' .class' в каждой из ваших точек данных, чтобы выяснить, какая часть является чем-то, а затем использовать конвертер, такой как '.to_i', чтобы преобразовать только тот, который вам нужен. Один из них должен сделать трюк! –

ответ

2

Основываясь на результатах рейза, о котором мы говорили в комментариях, похоже, что существует несоответствие класса. Самый простой способ исправить (и, ИМХО, проще читать) будет корректировать свой код валидатор следующим образом:

if session[:submitted_pin].to_i == @member_pin.to_i 
    render @member 
else 
    redirect_to '/' 
end 

Если есть шанс, что session[:submitted_pin] будет nil, вы можете использовать session[:submitted_pin].try(:to_i); который вернет nil, если переменная не установлена ​​и не позволяет получить ошибку.

+0

Yikes! Я получил эту ошибку: 'undefined method 'pin' для 5555: Fixnum' – briankulp

+0

Я также должен упомянуть - эта ошибка вызывается в' '%% = f.text_field: pin%>' части моего представления. Есть идеи? :/ – briankulp

+0

Получил его на работу - большое вам спасибо за помощь! – briankulp

Смежные вопросы