【问题标题】:Rails 5: Check returned enum value in controllerRails 5:检查控制器中返回的枚举值
【发布时间】:2016-10-01 17:32:09
【问题描述】:

我正在努力检查返回的枚举值。 在 models/roles.rb 我有枚举:

class Role < ApplicationRecord
  belongs_to :user, optional: true
  accepts_nested_attributes_for :user

  enum general: { seller: 1, buyer: 2, seller_buyer: 3}, _suffix: true
  enum dashboard: { denied: 0, viewer: 1, editer: 2, creater: 3, deleter: 4}, _suffix: true

在 controllers/dashboard_controller.rb 我有这个:

class DashboardsController < ApplicationController
  def dashboard_1
    @roles = current_user.roles
    Role.select(:dashboard).where(user_id: current_user)
    if
     flash.now[:error] = "You can do whatever want!"
    else 
     flash.now[:error] = "Only view!"
   end
 end

在控制台中我可以得到这个:

Role.select(:dashboard).where(:user_id => 1)
Role Load (0.3ms)  SELECT "roles"."dashboard" FROM "roles" WHERE "roles"."user_id" = ?  [["user_id", 1]]`=> #<ActiveRecord::Relation [#<Role id: nil, dashboard: "deleter">]>` 

dashboard: "deleter" 是我想要的结果。 我想在控制器中检查仪表板的用户角色是否为“删除者”(flash.now 说“你可以随心所欲!”

请问您有什么建议吗?非常感谢!

更新

这是我的控制器/dashboard_controller.rb

def dashboard_1
  @roles = current_user.roles
    if @roles.any? { |role| role.deleter_dashboard? }
      flash.now[:error] = "You are deleter!"
    elsif @roles.any? { |role| role.viewer_dashboard? }
      flash.now[:error] = "You are viewer!"
    else 
      redirect_to users_path
    end
  end

在dashboard_1.html.erb 中,我尝试仅在用户是“仪表板”部分的“删除者”时才显示“新广告系列”按钮:

<% if @roles.deleter_dashboard? %>
   <%= link_to new_campaign_path(@campaign), {method: 'get', class: 'btn btn-w-m btn-primary'} do %>New campaign
   <% end %>
<% end %>

但是我不断收到此错误 - 未定义方法 deleter_dashboard?对于角色::ActiveRecord_Associations_CollectionProxy 如何让它正常工作?

【问题讨论】:

    标签: ruby-on-rails ruby enums


    【解决方案1】:

    也许你可以只使用你已经初始化的实例变量@roles

    if @roles.any? { |role| role.deleter_dashboard? }
      flash.now[:error] = "You can do whatever want!"
    else 
      flash.now[:error] = "Only view!"
    end
    

    你应该可以根据documentation of Enumrole.deleter_dashboard?

    【讨论】:

    • 不客气。另外-我并没有真正看到您要实现的功能的全部范围,但我想您不必为此目的初始化实例变量@roles,请改用roles(考虑到您之后不会通过控制器方法访问此信息)。
    • 感谢您的提示。在理想世界中,我想在登录时缓存所有 current_user 角色。 Role.where(:user_id =&gt; 1) 查找第一个用户的所有角色。它是来自 Roles 表的具有多列(单元格中的枚举)的单行。使用缓存中的此信息,我将在访问我的应用程序的任何部分时检查 current_user 角色。你知道如何做到这一点吗?任何提示都会很棒。
    • 您绝对可以在登录时缓存角色虽然我不确定这是否有必要。我认为使用角色缓存不会有太多的性能提升(如果有的话),最后你无论如何都必须在登录时查询数据库,我真的怀疑在这里有一个查询会损害你的应用程序性能。不要试图使事情过于复杂,在需要时进行优化:)。顺便说一句,您可能想检查 pundit gem 以获得用户授权,甚至可能要检查 rolify
    • 是的,我不会做缓存的事情。不确定我是否需要 Rolify,因为我可以为应用程序的每个部分执行此角色检查查询。我正在尝试实施 Pundit,但是有些东西无法正常工作。所以我在没有 Pundit 的情况下进行试验:&lt;% role.creater_campaigns? or role.deleter_campaigns? %&gt; &lt;%= link_to "New campaign", new_campaign_path(@campaign) %&gt; &lt;% end %&gt; 但我得到 _expecting end-of-input _ 错误
    • 您可能在第一个 ebmedded Ruby 条件语句中缺少if,它应该看起来像这样&lt;% if role.creater_campaigns? || role.deleter_campaigns? %&gt;。如您所见,我将or 替换为||andor 运算符通常用于控制流 (explanation) 和 some people even discourage you to use it at all
    猜你喜欢
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多