我正在使用cancan进行授权。我有一个共享视图,需要根据它是哪个控制器进行授权。
问题是: 我有共享部分(description.rhtml),它由两个不同的模型(产品和订单)使用。所以当有人去
时www.example.com/product/1 - 说明部分显示了有关产品的说明 www.example.com/order/1 - 说明部分显示有关订单的说明
此描述部分上有编辑按钮,因此用户可以编辑它,但条件是
我的能力等级检查
如果用户是否为所有者 - 取决于产品或订单控制器 但是在观点上:
if (can? :update, @orders) || (can? :update, @product)
< hide edit button >
end
但是可以吗? :update,@ orders返回true或false,它仅显示或隐藏编辑按钮,具体取决于该条件
所以我的问题是如何使用CanCan来解决这个问题
希望我很清楚。
答案 0 :(得分:1)
我认为你不应该对产品和订单使用完全相同的部分。
您可能想要使用布局:
视图/布局/ description.html.erb
<div class="description">
<%= model.description %>
<!-- other common code... -->
<div class="actions">
<%= yield %>
</div>
</div>
视图/命令/ description.html.erb
<%= render :layout => "layouts/description", :locals => { :model => @order } do %>
<%= if (can? :update, @order) %>
your link
<% end %>
<%= end %>
你不必这样做,但我认为它比在同一部分处理几个模型更清晰。
旁注:
but if can? :update, @orders return true or false, it show or hides edit button depending on that condition only
我真的不明白。如果@orders为null,那么可以吗?将返回false,整个表达式的结果将是(can? :update, @product)
的结果,我认为这是你想要的。