Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 具有权威的视图中的属性级授权_Ruby On Rails_Authorization_Pundit - Fatal编程技术网

Ruby on rails 具有权威的视图中的属性级授权

Ruby on rails 具有权威的视图中的属性级授权,ruby-on-rails,authorization,pundit,Ruby On Rails,Authorization,Pundit,我在rails应用程序中使用pundit进行授权。对于某些模型,我需要属性级授权。例如,允许普通用户更改其电话号码,但不能将其状态设置为“管理员” 按照中的建议,我正在为此使用允许的\u属性 现在我想在视图中访问这些属性,以决定在表单中显示或启用哪些字段。有没有一种(优雅的)方法可以做到这一点,而不必重复那里的授权字段?首先,您可能需要在应用程序策略中添加一些漂亮的快捷方式,它允许您检查是否允许属性: class ApplicationPolicy #... def permits_

我在rails应用程序中使用pundit进行授权。对于某些模型,我需要属性级授权。例如,允许普通用户更改其电话号码,但不能将其状态设置为“管理员”

按照中的建议,我正在为此使用
允许的\u属性


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

首先,您可能需要在
应用程序策略中添加一些漂亮的快捷方式,它允许您检查是否允许属性:

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
然后,您可以创建自定义表单生成器(或扩展表单生成器的模块):

见:


谢谢,我将这些方法添加到应用程序策略中,并创建了自定义表单生成器,但我似乎无法从帮助器访问策略。我得到了一个“未定义的#方法'policy'”你试着调用@template.policy了吗?我发现我打了个错字并用空格写了出来@template是指向视图上下文的链接,它应该具有策略,而不是表单生成器类。是的,我尝试了@template.policy和view\u context.policy。在视图本身中,我可以毫无问题地访问策略。因为默认的表单生成器是在初始值设定项中设置的,所以我必须重新启动rails服务器才能使更改生效<代码>允许的属性。包括?(attrs)
不起作用,因为attrs是数组。这应该类似于
attrs.all?{| e |允许的属性。包括?(e)}
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 %>
ActionView::Base.default_form_builder = MyFormBuilder