Ruby on rails Rails4:限制控制器销毁操作

Ruby on rails Rails4:限制控制器销毁操作,ruby-on-rails,controller,ruby-on-rails-4,Ruby On Rails,Controller,Ruby On Rails 4,我在控制器中设置了我的当前_用户,因此用户不能编辑其他用户的条目 但我可以让它在摧毁行动中发挥作用 我唯一的解决办法是检查用户是否是实际的上传者,然后向他显示销毁链接 <% if current_user == shop.user %> <td><%= link_to 'Destroy', shop, method: :delete, data: { confirm: 'Are you sure?' } %></td> <% end

我在控制器中设置了我的当前_用户,因此用户不能编辑其他用户的条目

但我可以让它在摧毁行动中发挥作用

我唯一的解决办法是检查用户是否是实际的上传者,然后向他显示销毁链接

 <% if current_user == shop.user %>
    <td><%= link_to 'Destroy', shop, method: :delete, data: { confirm: 'Are you sure?' } %></td>
<% end %>

但这不是一个坏习惯吗,因为有人可以很容易地破解它

如果有人能在这方面启发我。。。
谢谢:)

您应该在视图中隐藏它,但也应该在控制器上控制它

在控制器中,您必须在执行操作之前执行类似于的操作(请在此处阅读:)

您可以使用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 %>
        @shop = Shop.find(params[:id])
        authorize! :destroy, @shop
这是一个非常有用的宝石,并且有很好的文档记录

另一种方法:

您可以使用单数resource()代替复数,而不是传递店铺id进行编辑、更新和销毁

routes.rb:

resources :shops, only: :show, :index
resource :shop, only: [:new, :create, edit, :update, :destroy]
您还需要在_action之前更改
,以便它获取当前用户的店铺,而不是通过作为参数传递的
id
进行查询:

def set_shop
  @shop = current_user.shop
end

由于您不再使用web用户提供的
id
获取要销毁/编辑的店铺,因此他无法使用假id进行自定义请求。

我的控制器a中已经有了\u操作。->在执行以下操作之前:设置店铺,仅:[:显示,:编辑,:更新,:销毁]。。你能编辑你的答案吗?每个
用户
都有一家
商店
还是可以有多家
商店
?这完全是另一个问题。我试图设置它,所以用户的将被限制为1,但没有得到它的工作。通常情况下,用户应该只有一家店铺。我以前曾尝试将用户限制在一家店铺内,但我花了数小时尝试,并将所有错误都纠正了。你能帮我吗?你介意和我一起聊天吗?->
def set_shop
  @shop = current_user.shop
end