这是设置多个设计sign_in表单的最佳方法

时间:2015-12-31 06:21:37

标签: ruby-on-rails devise

我想我会走错路。 我正在使用Devise 3.5.3和Rails 4.2.5 我有3种不同的用户:普通用户,卖家和兑换商。 每种类型都应该有自己的sign_in页面,因为普通用户只能通过Facebook登录,卖家和兑换商会通过电子邮件登录。 到目前为止,我已经设置了这样的路线:

devise_for :users, class_name: 'FormUser', :controllers => { omniauth_callbacks: 'omniauth_callbacks', registrations: 'registrations' }

as :user do
  get 'seller', :to => 'devise/sessions#new'
  get 'redeemer', :to => 'devise/sessions#new'
end

我有一个新的会话视图,我根据另一个StackOverflow答案中建议的请求URL显示sign_in选项

<% if request.fullpath.include?('sign_in') %>
  show Facebook Login
<% else %>
  show regular devise form
<% end %>

这是一种时尚之后的作品。我的问题是,当输入无效凭证时,设计将重定向到/ users / sign_in页面而不是/ sellers或/ redeemers URL。

我可以按照这些说明进行操作

https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated

设置自定义重定向,但我觉得我的方向错误。整个设置看起来很乱。

对于我的用例的最佳实践,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

  

关于最佳做法

良好软件开发的主要支持者之一是Single Source of Truth(虽然不直接适用于您的问题,但突出了答案的一个主要方面) - 保持功能尽可能简单。 Rails通过DRY convention触及了这一点。

简而言之,只有一组功能,无限重用。

-

我会说您需要一条登录路线。您的用户无需关心他们是sellersredeemers还是standard users - &gt;他们希望登录您的应用并获得所需的功能:

#config/routes.rb
devise_for :users, class_name: 'FormUser', :controllers => { omniauth_callbacks: 'omniauth_callbacks', registrations: 'registrations' }
  

由于普通用户仅通过Facebook登录,卖家和兑换商通过电子邮件登录

为什么不同方有多种方法?

我认为您在身份验证和授权之间感到困惑:

  • 身份验证=用户登录?
  • 授权=用户有权限吗?

简而言之,authentication / Devise应该处理用户是否已登录。这与登录方法无关;他们使用facebook还是email应该是无关紧要的。

我个人允许所有用户使用他们想要的任何服务登录,然后使用授权实施(CanCanCan等)管理他们的访问权限。

-

如果不相关,我会删除它。