具有权威

时间:2016-04-18 06:33:31

标签: ruby-on-rails authorization pundit

我在rails应用程序中使用pundit进行授权。对于某些型号,我需要属性级授权。例如,普通用户可以更改其电话号码,但无法将其状态设置为" administrator"。

根据the Pundit docs的建议,我使用permitted_attributes进行此操作。

我现在想要在视图中访问这些属性,以决定在表单中显示或启用哪些字段。是否有一种(优雅的)方法,而不必在那里重复授权字段?

1 个答案:

答案 0 :(得分:4)

首先,您可能需要在ApplicationPolicy中添加一些不错的快捷方式,以便检查属性是否允许:

class ApplicationPolicy 
  #...

  def permits_attributes?(*attrs)
    attrs.keep_if({|a| permits_attribute?(a) }).any?
  end

  def permits_attribute?(attr)
    permitted_attributes.include?(attr)
  end

  # ...
end

然后,您可以创建自定义表单构建器(或扩展表单构建器的模块):

class MyFormBuilder < ActionView::Helpers::FormBuilder
  def can_fill_in?(attr)
    yield if @template.policy(object).permits_attribute?(attr)
  end
end
<%= form_for(@project, builder: MyFormBuilder) do |f| %>
  <%= f.can_fill_in?(:title) do %>
    <%= f.label :title %>
    <%= f.text_field :title %>
  <% end %>
<% end %>

您还可以配置rails以默认使用自定义表单构建器:

ActionView::Base.default_form_builder = MyFormBuilder

请参阅: