设计自定义用户属性acessors

时间:2014-06-28 15:09:30

标签: ruby-on-rails ruby devise omniauth

我是铁杆新手,我试图自定义验证。

我已完成自定义确认邮件视图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模板调用它?

1 个答案:

答案 0 :(得分: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(或装饰者)。


N.B。:我不会通过电子邮件提交密码,除非它已加密。