【问题标题】:devise custom user attribute acessors设计自定义用户属性访问器
【发布时间】:2014-06-28 15:09:30
【问题描述】:

我是 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'

如果我想自定义这些字符串,让我们说打印而不是'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 模板调用它?

【问题讨论】:

  • 如果您只想打印人类可读的(第一个字母大写)字符串,您可以在确认说明中使用它:&lt;%= @resource.provider.humanize %&gt; 您可以在这里查看更多信息:api.rubyonrails.org/classes/String.html#method-i-humanize
  • 这是我的第一个想法,但我想知道是否有更好的选择更尊重 MVC 模式,以防我以后想扩展它。

标签: ruby-on-rails ruby devise omniauth


【解决方案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

不过,更好的方法a presenter(或装饰器)。


注意:除非加密,否则我不会通过电子邮件提交密码。

【讨论】:

  • 使用 OAuth 通过提供商注册时,Devise 会生成一个随机密码。我的想法是通过电子邮件将此密码发送给用户,这样他们就不必总是通过提供商登录。但是我是新手,我当然接受建议,因为我的想法可能并不总是正确的。你的意思是我应该加密整个电子邮件?或者,仅当密码是由设计生成的密码时才发送密码就足够了。无论如何,非常感谢,我可能会使用演示者。
  • 我建议不要发送密码根本。如果你加密邮件,你要么要求接收者使用 PGP(虽然这不是一件坏事),要么以某种方式传输解密密钥,最好也不要未加密......另一方面,整个目的 的 OAuth 提供者是,您不必管理 n 密码,而只需为提供者管理一个密码,您的用户将通过该密码来识别自己。如果您坚持使用本地密码,请将其设为可选,并让用户在首次登录后自行选择。
  • 好吧,我明白你的意思了,我可能不会使用本地密码。无论如何,演示者填补了涉及 Web 应用程序其他部分的不足,所以 Draper 对我来说真的很有帮助。再次感谢!
猜你喜欢
  • 2018-03-25
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多