2016-12-06 2 views
1

У меня есть относительно простое приложение Rails с формой, использующей драгоценный камень Devise. Форма не требует имени пользователя, но требует адрес электронной почты. Все работает нормально, и страница направляет пользователя на следующую страницу, когда их адрес электронной почты является строчным. Тем не менее, когда пользователь вводит адрес электронной почты с символом верхнего регистра в строке, я получаю следующее сообщение об ошибке с Rails:Rails - заглавные адреса электронной почты вызывают ошибки независимо от того, что я пытаюсь

NoMethodError at /users 
undefined method `uuid' for nil:NilClass 

RegistrationsController#create 
app/controllers/registrations_controller.rb, line 81 

В строке 81 (email: new_user.email,):

account   = Account.create(user: resource) 
new_user  = User.find_by_email(params[:user][:email]) 
recurly_account = Recurly::Account.create(
     account_code: new_user.uuid, 
     email:  new_user.email, 
     first_name: new_user.first_name, 
     last_name: new_user.last_name 
) 
sign_in new_user 

Параметры запроса:

{"utf8"=>"✓", 
"authenticity_token"=>"ySBGjHGNwiyeBqGh9nv0N5a8fIJO51bi1nIByev6a21Zh+ncMx5d99cTGKbKWpPvdYmGiBfLX9Gya0qmglrBWg==", 
"plan"=>"10day-fmf", 
"disc"=>"firstmonthfree10day", 
"user"=>{"first_name"=>"asdf", "last_name"=>"asdfsadf", "email"=>"[email protected]", "password"=>"lsdkjlfkjlskjdf"}, 
"commit"=>"TRY RISK FREE!", 
"controller"=>"registrations", 
"action"=>"create"} 

--Примечания адреса электронной почты, с прописными буквами

Я исследовал эту проблему широко и обнаружил, что она имеет какое-то отношение к тому, что адрес электронной почты не будет правильно удален. Таким образом, на основе своих исследований я добавил следующий код в различные файлы:

# Devise.rb 
config.case_insensitive_keys = [:email] 
# User.rb 
def downcase_email 
    self.email.downcase! 
end 

#registrations_controller.rb 
def check_email 
    email = params[:email].downcase 
    check = User.where(email: email).first 

    begin 
    check_recurly = Recurly::Account.find(email) 

    if check_recurly 
     recurly_email = "taken" 
    end 
    rescue Recurly::Resource::NotFound => e 
    recurly_email = "available" 
    end 

Однако, несмотря на все мои попытки downcasing адреса электронной почты, введенный пользователем, прописные буквы по-прежнему вызывают ошибку! Любая помощь, которую могли бы мне дать, была бы очень признательна! Благодаря

+1

это может помочь: https://github.com/plataformatec/devise/wiki/How-To:-Use-case-insensitive-emails appareantly вам нужно использовать: 'User.find_for_authentication (email: params [: email]) 'вместо' User.where (email: email) ' –

ответ

2

Попробуйте добавить .downcase здесь:
new_user = User.find_by_email(params[:user][:email].downcase)

Я полагаю, что в базе данных, хранящимся в нижнем регистре значение электронной почты, но в контроллере в params[:user][:email] у вас есть «[email protected]». Вот почему User.find_by_email(params[:user][:email]) возвращает nil, и вы не можете позвонить uuid метод на ноль.

+0

Спасибо! это сработало для меня, и ваш ответ имеет смысл! – user3826864

0

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

Чтобы опустить корпус в контроллере, чтобы понизить Params вы можете сделать

before_action :downcase_email, if: -> { params[:user][:email].present? } 

def downcase_email 
    params[:user][:email].downcase! 
end 

Btw вы могли refacto этого метода check_email в:

def check_email 
    return unless params[:email].present? 

    user = User.find_by_email(params[:email].downcase) 
    return 'taken' if Recurly::Account.find(user) 
    'available' 
end 

Что-то вроде этого. Вам не нужно использовать start/rescue

1

Хотя, я уже отметил правильный ответ выше, я хотел бы упомянуть, что немного javascript событие onchange также устранило проблему!

<%= f.input_field :email, placeholder: "Email", id:"email", onchange: "this.value=this.value.toLowerCase();" %> 
Смежные вопросы