pundit 视图中的属性级授权
Attribute level authorization in views with pundit
我在 rails 应用程序中使用 pundit 进行授权。对于某些模型,我需要属性级别的授权。例如,允许普通用户更改他的 phone 号码,但不能将他的状态设置为 "administrator".
根据 the Pundit docs 中的建议,我为此使用 permitted_attributes
。
我现在想在视图中访问这些属性,以决定在表单中显示或启用哪些字段。有没有一种(优雅的)方法可以做到这一点,而无需在那里重复授权字段?
首先,您可能想在 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
参见:
我在 rails 应用程序中使用 pundit 进行授权。对于某些模型,我需要属性级别的授权。例如,允许普通用户更改他的 phone 号码,但不能将他的状态设置为 "administrator".
根据 the Pundit docs 中的建议,我为此使用 permitted_attributes
。
我现在想在视图中访问这些属性,以决定在表单中显示或启用哪些字段。有没有一种(优雅的)方法可以做到这一点,而无需在那里重复授权字段?
首先,您可能想在 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
参见: