【发布时间】:2016-07-27 17:09:00
【问题描述】:
我在我的模型中使用了一个枚举,定义如下:
enum role: [:member, :content_creator, :moderator, :admin]
我想要一种从用户当前角色获取下一个角色的简单方法,所以我想出了这个:
def self.next_role(user)
begin
User.roles.drop(User.roles[user.role] + 1).to_enum.next
rescue StopIteration
nil
end
end
在视图中,我可能会在此添加以下方法链:[...].first.humanize.titleize。
我在这里只是有点担心我的解决方案,但主要想知道是否有更好的(阅读:更多内置)方法来获得我想要的东西?我知道那里只有四个枚举,我承认我是从if ... elsif ... etc. 开始实施的。换句话说,我发现自己对 Rails 比对 Ruby 本身更精通。有人能详细说明一个人“应该”如何做到这一点吗?
【问题讨论】:
-
处理包装吗?
:admin的“下一步”是什么? -
射击。好问题。您如何看待
nil作为候选人?我希望该方法能够传达:admin之后什么都没有。 -
您在这里定义了非标准行为,因此您需要制定规则。我只是说你需要考虑这样的情况,以确保它始终如一地以有意义的方式发挥作用。
-
同意。我认为这就是我希望它工作的方式,但我看到在场景中我得到了一个异常而不是 nil :(
-
我更新了我建议的解决方案,以考虑当前角色为管理员时对下一个角色的看法。感谢您的意见@tadman
标签: ruby-on-rails ruby ruby-on-rails-4 enumeration enumerable