使用白名单和黑名单的Ruby on Rails允许当前用户查看页面

时间:2017-08-16 10:11:44

标签: ruby-on-rails ruby whitelist blacklist

基本上我想看看用户是否添加了任何blacklist_users或whitelist_users,然后根据它允许或禁止它们,但我无法正确地找出代码:(us_id基本上是user_id)

关系:   Blacklist_user模型:

belongs_to :b_page

Whitelist_user模型:

 belongs_to :b_page

B_page模型:

   has_many :whitelist_user
   has_many :blacklist_user

控制器:

if !(@b_page.whitelist_user.empty?)
   @whitelist_users = @b_page.whitelist_user.map(&:us_id)
   @whitelist_users.push(@b_page.user.id)
 else
   @whitelist_users = []
 end    
 if !(@b_page.blacklist_user.empty?)
   @blacklist_users = @b_page.blacklist_user.map(&:us_id)
  else
   @b_page.blacklist_user = []
   @blacklist_users = @b_page.blacklist_user.map(&:us_id)
 end

的观点:

<% if ((!(@whitelist_users.empty?)) && @whitelist_users.include?(current_user.id)) || ((!(@blacklist_users.empty?)) && @blacklist_users.exclude?(current_user.id)) %>
<!-- show bpage -->


<% elsif ! ((!((@whitelist_users.empty?)) && @whitelist_users.include?(current_user.id)) || ((!(@blacklist_users.empty?)) && @blacklist_users.exclude?(current_user.id)))%>
<!-- user not allowed-->
<% else %>
<!-- show bpage-->
<% end %>

但是当我以@ b_page.user身份登录时,我得到了(顺便说一下,我使用了设计) 是否有更好的方法来实现这一点,而不是使其复杂化

1 个答案:

答案 0 :(得分:0)

如果它们是单独的型号,那么您可以在控制器操作中执行此操作。 Devise附带了一个方法user_signed_in ?,它将告诉您用户是否已登录。在你的情况下:

blacklist_user_signed_in?
whitelist_user_signed_in?

然后在您的控制器操作中显示页面:

if blacklist_user_signed_in?
  return redirect_to root_path,
         notice: 'You are not alllowed to access this part of the site'
end

这假设您的模型名为blacklist_user和whitelist_user。如果他们只是拥有属性并且是相同的模型,您可以这样做:

 current_user.blacklisted?

并在您的用户模型中

def blacklisted?
  blacklist
end

再一次假设您的“用户”模型中有一个名为“黑名单”的属性。