我使用带有rails的Devise gem,我有一个Item页面,其中的按钮链接到Home
Edit
和Destroy
。如果未创建项目的用户尝试编辑或销毁该项目,则会收到错误消息,并且该项目不会被编辑或销毁。
虽然,我希望如果没有创建特定项目的用户登录,他们就无法查看该项目上的编辑或销毁按钮。
目前我有这个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
控制器可以正常工作,防止未登录的用户或未创建项目的用户无法删除或编辑该项目。虽然如果用户已登录但仍然可以单击按钮,但是没有创建该项目。
任何人都知道如何提供帮助?
答案 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 %>