我在Controller中设置了current_user,因此用户无法编辑其他用户的条目。
但是我可以让它为Destroy Action工作。
我唯一的解决方案是检查用户是否是实际上传者,然后才向他显示销毁链接。
<% if current_user == shop.user %>
<td><%= link_to 'Destroy', shop, method: :delete, data: { confirm: 'Are you sure?' } %></td>
<% end %>
但是他不是一个糟糕的做法,因为有人可以轻易入侵这个?
如果有人能在这方面给我启发...... 谢谢:)
答案 0 :(得分:1)
您可以使用CanCan gem。安装完成后,CanCan将生成一个“能力”文件,您可以在其中定义用户可以做什么或不能做什么。以你为例,你可能有
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.admin?
can :manage, :all
else
can :read, :all
end
end
然后在您的视图中,您可以进行简单的检查,以查看用户是否能够修改该对象。例如:
<% if can? :destroy, shop %>
<td><%= link_to 'Destroy', shop, method: :delete, data: { confirm: 'Are you sure?' } %></td>
<% end %>
在您的控制器中,您可以授权此类操作:
class ShopsController < ActionController::Base
load_and_authorize_resource
def destroy
....
end
end
“load_and_authorize_resource”行将自动为每个RESTful操作添加授权。它会将此添加到您的销毁操作中,例如:
@shop = Shop.find(params[:id])
authorize! :destroy, @shop
这是一个非常有用的宝石,并且有很好的记录
答案 1 :(得分:1)
另一种方法:
您可以使用单一资源(http://guides.rubyonrails.org/routing.html#singular-resources)而不是复数来代替传递商店ID进行编辑,更新和销毁。
routes.rb中:
resources :shops, only: :show, :index
resource :shop, only: [:new, :create, edit, :update, :destroy]
您还需要更改before_action
,以便获取当前用户的商店,而不是通过作为参数传递的id
进行查询:
def set_shop
@shop = current_user.shop
end
由于您不再使用网络用户提供的id
获取要销毁/编辑的商店,因此他无法使用假身份证制作自定义请求。
答案 2 :(得分:0)
您应该将其隐藏在视图中,但您也应该在控制器上控制它。
在您的控制器中,您必须执行类似 before_action 的操作(在此处阅读:http://guides.rubyonrails.org/action_controller_overview.html)