设计身份验证不隐藏更新/销毁按钮

时间:2016-06-30 04:55:53

标签: ruby-on-rails ruby devise

我使用带有rails的Devise gem,我有一个Item页面,其中的按钮链接到Home EditDestroy。如果未创建项目的用户尝试编辑或销毁该项目,则会收到错误消息,并且该项目不会被编辑或销毁。

虽然,我希望如果没有创建特定项目的用户登录,他们就无法查看该项目上的编辑或销毁按钮。

目前我有这个if语句我认为可行,但它只适用于用户根本没有登录的情况。如果有人登录但未创建该项目,他们仍然可以查看编辑和销毁按钮。

show.html.erb if statement:

  <%= link_to "Home", root_path, class: "btn btn-sm btn-default" %>
  <% if current_user %>
    <%= link_to "Edit", edit_item_path(@item), class: "btn btn-sm btn-default" %>
    <%= link_to "Delete", item_path(@item), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-sm btn-default" %>
  <% end %>

在Items控制器中,这些是之前的属性:

before_action :find_item, only: [:show, :edit, :update, :destroy]
before_action :authorized_user, only: [:edit, :update, :destroy]
before_filter :authenticate_user!, except: [:index, :show]

在控制器中创建方法:

def create
    @item = current_user.items.build(items_params)

        if @item.save
            redirect_to @item
        else
            render "new"
        end
end

控制器可以正常工作,防止未登录的用户或未创建项目的用户无法删除或编辑该项目。虽然如果用户已登录但仍然可以单击按钮,但是没有创建该项目。

任何人都知道如何提供帮助?

1 个答案:

答案 0 :(得分:1)

仅在用户登录并创建项目时显示链接。

您没有提供模型分析以获得更详细的答案,但尝试下一步:

<%= link_to "Home", root_path, class: "btn btn-sm btn-default" %>
  <% if current_user && @item.created_by(current_user)%>
    <%= link_to "Edit", edit_item_path(@item), class: "btn btn-sm btn-default" %>
    <%= link_to "Delete", item_path(@item), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-sm btn-default" %>
  <% end %>

请注意,我只是假设你有这样的方法@item.created_by(current_user)

<强>更新

那应该有用

<%= link_to "Home", root_path, class: "btn btn-sm btn-default" %>
  <% if current_user && current_user.items.include?(@item)%>
    <%= link_to "Edit", edit_item_path(@item), class: "btn btn-sm btn-default" %>
    <%= link_to "Delete", item_path(@item), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-sm btn-default" %>
  <% end %>