разработка пользовательских процессоров пользовательских атрибутов

#ruby-on-rails #ruby #devise #omniauth

#ruby-on-rails #ruby #разработка #omniauth

Вопрос:

Я новичок в rails и пытаюсь настроить аутентификацию.

Я сделал пользовательский просмотр подтверждения по почте app/views/devise/mailer/confirmation_instructions.html.erb следующим образом:

 <p>Welcome <%= @email %>!</p>
<p>
  Thanks for registering. You have registered through <%= @resource.provider %>.
  The account data has been created automatically as follows:
</p>
<ul>
  <li><strong>User Name:</strong> <%= @resource.name %></li>
  <li><strong>Password:</strong> <%= @resource.password %></li>
</ul> 
<p>You can confirm your account email through the link below:</p>
<p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p>
  

@resource.provider Возвращает строку, такую как 'facebook' , 'twitter' , 'github' .

Если бы я хотел настроить эти строки, скажем, вместо print 'Facebook' , 'Twitter' , 'GitHub' …, как мне это сделать? Моя первая идея — это метод

 def print_cool_provider(provider)
  if provider == 'facebook'
    return 'Facebook'
  else if ...
    ...
  end
end
  

Я рассматриваю конечный короткий список возможных поставщиков, с которыми я могу обращаться один за другим. Мои настоящие вопросы больше касаются MVC, Rails и Devise:

Где я должен определить этот метод, чтобы учитывать шаблон MVC и в то же время иметь возможность вызывать его из confirmation_instructions.html.erb шаблона?

Комментарии:

1. Если вы хотите напечатать только удобочитаемую строку (первая буква в верхнем регистре), вы можете использовать это в своих инструкциях по подтверждению: <%= @resource.provider.humanize %> Вы можете посмотреть здесь для получения дополнительной информации: api.rubyonrails.org/classes/String.html#method-i-humanize

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

Ответ №1:

Вы могли бы добавить простой помощник, например:

 # app/helpers/provider_helper.rb
module ProviderHelper

  # only special cases, where #titlecase won't suffice
  PROVIDER_NAMES = {
    'github'        => 'GitHub',
    'google_oauth2' => 'Google'
  }

  def provider_name(user)
    PROVIDER_NAMES[user.provider] || user.provider.titlecase
  end
end
  

Однако лучшим подходом был бы презентатор (или декоратор).


Примечание: я бы не отправлял пароль по электронной почте, если он не зашифрован.

Комментарии:

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

2. Я бы посоветовал вообще не отправлять пароли. Если вы шифруете почту, вам либо требуется, чтобы получатель использовал PGP (что, впрочем, неплохо), либо каким-то образом передавал ключ дешифрования, желательно также не в незашифрованном виде… С другой стороны, вся цель поставщиков OAuth заключается в том, что вам не нужно управлять n паролями, а только одним для поставщика, с помощью которого ваши пользователи будут идентифицировать себя. Если вы настаиваете на локальном пароле, сделайте его необязательным и позвольте пользователю выбрать свой собственный после первого входа в систему.

3. Хорошо, я понимаю вашу точку зрения, тогда я, вероятно, не буду использовать локальные пароли. В любом случае, докладчики восполняют недостаток, связанный с другими частями веб-приложения, поэтому Draper будет действительно полезен для меня. Еще раз спасибо!