ruby-on-rails – 仅允许Rails强参数中的某些可能值

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 仅允许Rails强参数中的某些可能值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个带有用户模型的rails应用程序,它可以有多个角色.我使用像这样的位掩码实现了这个:
  1. class User < ActiveRecord::Base
  2. DEFAULT_ROLES = %w[developer entrepreneur]
  3. ROLES = ['admin','entrepreneur','developer']
  4.  
  5. def has_role?(role)
  6. roles.include?(role.to_s)
  7. end
  8.  
  9. def is?(role)
  10. has_role?(role)
  11. end
  12.  
  13. def roles=(roles)
  14. self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0,:+)
  15. end
  16.  
  17. def roles
  18. ROLES.reject do |r|
  19. ((roles_mask.to_i || 0) & 2**ROLES.index(r)).zero?
  20. end
  21. end
  22. end

在应用的注册页面中,我希望用户选择他们是“企业家”还是“开发者”.但是,我想确保他们无法为自己(或任何其他人)分配任何其他角色,除非他们已经是管理员.

我的第一个想法是在role =方法中通过改变它看起来像这样做

  1. def roles=(roles)
  2. unless current_user.is?(:admin)
  3. validates_inclusion_of roles,:in => DEFAULT_ROLES
  4. end
  5. self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0,:+)
  6. end

但是,正如我发现的那样,你无法从模型内部访问current_user(如果你考虑它我觉得有意义……)

我的下一次尝试是看看我是否可以使用Strong Parameters执行此操作.

我期待它看起来像这样(我正在使用设计,覆盖RegistrationsController)

  1. class RegistrationsController < Devise::RegistrationsController
  2.  
  3. private
  4. def sign_up_params
  5. if (user_signed_in?) && (current_user.is?(:admin))
  6. params.require(:user).permit(:name,:school,:email,:password,:password_confirmation,{roles: User::ROLES})
  7. else
  8. params.require(:user).permit(:name,{roles: User::DEFAULT_ROLES})
  9. end
  10. end
  11.  
  12. def account_update_params
  13. if (user_signed_in?) && (current_user.is?(:admin))
  14. params.require(:user).permit(:name,:current_password,:about_me,{roles: User::ROLES})
  15. else
  16. params.require(:user).permit(:name,:current_password)
  17. end
  18. end
  19. end

但是,当我尝试这个时,我得到了这个:
这让我觉得我误解了强参数的真正作用.

是否可以根据用户在强参数中的角色来限制用户可以为任何给定字段输入的值?如果没有,是否有不同的方法来实现这一目标?

解决方法

我想通了,这就是我做到的. (这是方法重写Devise的RegistrationController,如果你没有使用设计,那么只需替换任何方法控制输入新用户的参数.)
  1. class RegistrationsController < Devise::RegistrationsController
  2.  
  3. private
  4. def sign_up_params
  5. parameters = params.require(:user).permit(:name,roles: [])
  6. unless (user_signed_in?) && (current_user.is?(:admin))
  7. parameters[:roles] = parameters[:roles].reject { |h| !User::DEFAULT_ROLES.include? h }
  8. parameters
  9. end
  10. end
  11.  
  12.  
  13. def account_update_params
  14. if can? :assign_roles,:all
  15. params.require(:user).permit(:name,roles: [])
  16. else
  17. params.require(:user).permit(:name,:current_password)
  18. end
  19. end
  20.  
  21. end

我刚刚将参数[:roles]中的参数过滤掉,只包含User :: DEFAULT_ROLES中包含的值(如上面的问题所示),然后返回参数对象.

猜你在找的Ruby相关文章