bme*_*ere 4 authorization ruby-on-rails pundit
我正在使用Pundit在Rails应用中进行授权。对于某些模型,我需要属性级授权。例如,允许普通用户更改其电话号码,但不能将其状态设置为“管理员”。
根据Pundit文档中的建议,我正在使用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
Run Code Online (Sandbox Code Playgroud)
然后,您可以创建一个自定义表单构建器(或扩展表单构建器的模块):
class MyFormBuilder < ActionView::Helpers::FormBuilder
def can_fill_in?(attr)
yield if @template.policy(object).permits_attribute?(attr)
end
end
Run Code Online (Sandbox Code Playgroud)
<%= form_for(@project, builder: MyFormBuilder) do |f| %>
<%= f.can_fill_in?(:title) do %>
<%= f.label :title %>
<%= f.text_field :title %>
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
您还可以将rails配置为默认使用自定义表单构建器:
ActionView::Base.default_form_builder = MyFormBuilder
Run Code Online (Sandbox Code Playgroud)
看到:
| 归档时间: |
|
| 查看次数: |
695 次 |
| 最近记录: |