2015-05-09 5 views
0

Для некоторых при регистрации validate_uniqueness_of не работает, даже если он работает при запуске консолиРубин на рельсы проверки ошибки

2.1.5 :001 > User.create_with_password('rajiv', 'abc') 
    (0.1ms) begin transaction 
    User Exists (0.4ms) SELECT 1 AS one FROM "users" WHERE "users"."username" = 'rajiv' LIMIT 1 
    (0.2ms) rollback transaction 
=> #<User id: nil, username: "rajiv", salt: "ddda20c52e698f6e5623d7e782e2cd19", password_hash: "565b91a38e2acc41887e3936fe660b68245b3f1d8118f38bbc..."> 
2.1.5 :002 > 

def register 
    @username = params[:Username] 
    @password = params[:password] 
    @rePassword = params[:rePassword] 
    user = User.create_with_password(@username, @password) 
     if user 
     session[:signed_in] = true 
     session[:username] = user.username 
     flash[:notice] = "User successfully created you can sign in now" 
     redirect_to '/Sign_up' 
     else 
     flash[:notice] = "User already exists" 
end 

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

https://ipt-dynaman.c9.io/Sign_up

вот мой код модели:

class User < ActiveRecord::Base 
    validates_presence_of :username, :salt, :password_hash 
    validates_uniqueness_of :username 

    def self.create_with_password(username, password) 
     salt = SecureRandom.hex 
     password_hash = self.generate_hash(password, salt) 

     self.create(
     username: username, 
     salt: salt, 
     password_hash: password_hash 
     ) 
    end 

    def verify_password(password) 
     self.password_hash == User.generate_hash(password, self.salt) 
    end 

    def self.generate_hash(password, salt) 
     digest = OpenSSL::Digest::SHA256.new 
     digest.update(password) 
     digest.update(salt) 
     digest.to_s 
    end 
end 

ответ

0

Во-первых, используйте Devise

Попросите своего контроллера создать экземпляр, установить атрибуты и сохранить. Ваши действия будут работать. См. ActionController Overview в направляющих Rails .

+0

Спасибо: D плохой дизайн разработки – dynaman

+0

create не только для отношений. Также сохраните и сохраните! оба запускают проверки - они просто отличаются тем, что они делают, если проверки говорят, что запись недействительна. –

+0

Истина о 'save' и' save! 'Вторая генерирует исключение, когда проверки не выполняются. Я не нашел никакого метода create для ActiveRecord, кроме как для ассоциаций. Ответ ссылается на «путь рельсов». –

0

Помимо того, что системы аутентификации и криптография сложны, чтобы получить право, ваша ошибка проста.

При выборе необходимости перенаправления на страницу успеха или выдачи сообщения об ошибке вы проверяете правду user. Однако, как показывают ваши тестовые тесты консоли, ваш create_with_password возвращает неиспользованного пользователя, если проверка не выполняется. Этот пользователь недействителен и не сохраняется в базе данных, но это не то, что тестирует ваш контроллер.

Вместо проверки ли user является truthy, вы могли бы вместо того, чтобы проверить user.valid?

0

вы можете использовать Save!, чтобы убедиться, если валидация не в состоянии. Сделки будут откатываться

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