根据用户角色修改属性值

时间:2015-06-04 23:08:55

标签: ruby-on-rails attributes transform resultset user-roles

我有一个专栏' created_by'在一张桌子里。根据登录用户的角色,我必须显示用户的id或用户的角色。假设登录用户的ID是客户,并且记录是由具有支持角色的用户创建的,那么它应该显示“支持”,如果支持登录则显示添加者的ID (即使它是一个不同的支持者的身份)。我可以弄清楚当前用户的角色。如何在不定义基于角色的单独api的情况下实现此目的?是否可以使用相同的API来根据查询从db获取结果,但是可以根据角色转换列。

1 个答案:

答案 0 :(得分:1)

我最初的想法是创建一个view helper

我会告诉你它的外观。由于您没有在问题中分享模型的名称,因此我选择了与用户具有created_by关系的任意模型(西瓜)。我意识到这是一个愚蠢的选择。我是一个谜......

应用/助手/ watermelons_helper.rb

module WatermelonsHelper
  def created_by_based_on_role(watermelon)
    if current_user.role == "Support" || watermelon.created_by.role == "Generic User"
      watermelon.created_by.name
    else 
      "The Watermelons.com Support Team"
    end
  end
end

应用/控制器/ watermelons_controller.rb

class WatermelonsController < Application Controller
  def show
    @watermelon = Watermelon.find(params[:watermelon_id])
  end
end

应用/视图/西瓜/ show.html.erb

...
<p>This watermelon was created by <%= created_by_based_on_role(@watermelon) %></p>
...

我之所以将其作为辅助方法而不是western.rb模型中的方法的原因是该方法依赖于current_user,模型每次都无法明确知道(假设您正在使用Devise或手动滚动的Hartl风格的current_user辅助方法。

编辑:根据反馈,让它成为一种模范方法......

应用/模型/ watermelons.rb

class Watermelon < ActiveRecord::Base
  ...
  def created_by_based_on_role(viewing_user)
    if viewing_user.role == "Support" || self.created_by.role == "Generic User"
      self.created_by.name
    else 
      "The Watermelons.com Support Team"
    end
  end
  ...
end

请注意,我将此实现为实例方法,这意味着您需要调用&#34; watermelon.created_by_based_on_role(current_user)&#34;在控制器或视图中。