如果能?不会隐藏show.html上的链接

时间:2013-03-07 16:11:31

标签: ruby-on-rails cancan

我刚刚安装了cancan,我遇到了一个快速的小问题。我应该可以使用if_can?应用操作隐藏链接。这样只有用户创建的信息当然可以查看编辑/删除链接。

我无法找到遇到同样问题的其他人。如果有人可以看看并帮助我,我将不胜感激。

show.html:

<div id="photos">
    <% for photo in @gallery.photos %>
    <div class="photo">
        <%= image_tag photo.image_url(:thumb).to_s %>
        <div class="name"><%= photo.name %></div>
        <div class="actions">
            <% if can? :update, @photo %>
            <%= link_to "edit", edit_photo_path(photo) %> |
            <% end %>
            <% if can? :remove, @photo %>
            <%= link_to "remove", photo, :confirm => 'Are you sure?', :method => :delete %>
            <% end %>
        </div>
      </div>
    <% end %>
    <div class="clear"></div>
</div>

<p>
  <%= link_to "Add a Photo", new_photo_path(:gallery_id => @gallery) %>
|
  <%= link_to "Remove Gallery", @gallery, :confirm => 'Are you sure?', :method => :delete %> |
  <%= link_to "View Galleries", galleries_path %>
</p>

ability.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    can :read, :all 
  end
end

2 个答案:

答案 0 :(得分:1)

好的,每个控制器都必须经过授权。最简单的方法是从照片开始并确保无法删除它。你需要这样的东西:

can :delete, Photo do |photo|
  question.try(:user) == user
end   

在你的能力.rb。在照片的控制器中,您需要输入load_and_authorize_resourceauthorize_resource

然后在您的视图中,您希望<%if can :remove, photo %>不是<%if can :remove, @photo>。当你@photo

时,你试图使用<for photo in @gallery.photos %>似乎很奇怪

答案 1 :(得分:0)

我也经历过这个问题。解决方法很简单,在Ability.rb类中执行如下操作

class Ability
  include CanCan::Ability

  def initialize(user)
  user ||= User.new # guest user (not logged in)
  if user.role == "admin"
    can :update, Photo, :user_id => user.id
  end 
end 

然后在index.html.erb中执行以下操作

<% @photos.each do |photo| %>
 <%if can? :update, photo %>
  <!-- hide your links and buttons here-->
 <%end%>
<%end%>

注意:在“&lt;%if can can?:update,photo%&gt;”中写“照片”而不是“照片”或“@photo”。因为这里的照片是可靠的,它会遍历循环。