CanCan用于共享视图

时间:2011-12-23 01:45:28

标签: ruby-on-rails ruby-on-rails-3 cancan

我正在使用cancan进行授权。我有一个共享视图,需要根据它是哪个控制器进行授权。

问题是: 我有共享部分(description.rhtml),它由两个不同的模型(产品和订单)使用。所以当有人去

www.example.com/product/1 - 说明部分显示了有关产品的说明 www.example.com/order/1 - 说明部分显示有关订单的说明

此描述部分上有编辑按钮,因此用户可以编辑它,但条件是

  • 在产品/ 1页面或
  • 上,用户必须是产品的所有者
  • 用户订购时的订单所有者/ 1页。

我的能力等级检查

  • 如果用户是否为所有者 - 取决于产品或订单控制器 但是在观点上:

    if (can? :update, @orders) || (can? :update, @product)
    < hide edit button >
    end
    

    但是可以吗? :update,@ orders返回true或false,它仅显示或隐藏编辑按钮,具体取决于该条件

所以我的问题是如何使用CanCan来解决这个问题

希望我很清楚。

1 个答案:

答案 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)的结果,我认为这是你想要的。