让我们开始吧,我刚开始编写rails并尝试通过构建项目来学习。我正在创建一个具有类似于twitter的跟随和跟随功能的项目...我已经实现了删除帖子的选项。但是,似乎我可以删除其他人发布以及我正在关注等。我如何实现删除我自己的帖子,并让其他用户有能力编辑修改和删除自己的帖子。
class Post < ActiveRecord::Base
belongs_to :user
validates :user_id, presence: true
validates :content, presence: true, length: { maximum: 140 } #
default_scope -> { order(created_at: :desc) } # newest tweets / posts first
end
def destroy
@status_update = Post.find(params[:id])
if @status_update.present?
@status_update.destroy
end
redirect_to root_url
端
<%= link_to('Delete', post_path(@p), :method => :delete,data: { confirm: "Are you sure?" } ) %>
我也在看这样的事情:
def owned_post
unless current_user == @post.user
flash[:alert] = "That post doesn't belong to you!"
redirect_to root_path
end
end
答案 0 :(得分:0)
在视图上指定如下内容:
<% if user_signed_in? && current_user.id == @post.user_id %>
# something like edit. links... delete links..
<% end %>
或者您也可以使用gem:cancancan
答案 1 :(得分:0)
假设您有一个Post
模型并查看所有设置:
在views/posts/show
中,您可以设置如下内容:
<% if @post.user.id == current_user.id %>
<%= link_to "Edit", edit_post_path(@post), class:"btn btn-success btn-sm" %>
<% end %>
您仍然会遇到一个小问题,用户仍然可以访问要编辑的表单,因此现在在views/posts/edit
中,它会呈现一个表单,因此会对其进行处理:
<% if user_signed_in? %>
<% if @post.user.id == current_user.id %>
<%= render 'form', tutorial: @post %>
<% end %>
<% else %>
<h1>stop trying to edit others post</h1>
<% end %>
答案 2 :(得分:-1)
好问题,虽然没有一个答案可以给你。 '#授权&#34;的问题您的应用中的操作很重要,有一些像Pundit这样的宝石,您可以查看完整的解决方案。
但是,从自己的基础开始并构建更大的解决方案总是好的。您已经没有错 - 只需将before_action :owned_post, only: [:delete]
(可能重命名为ensure_post_owner
等)添加到您的控制器以强制执行您的规则。
另一种选择是将ActiveRecord查询范围限定为允许当前用户操作的对象集。因此,@post = Post.find(params[:id])
代替@post = current_user.posts.find(params[:id])
,而不是if-else
。如果用户试图修改他们不拥有的帖子,他们将返回404,就好像该帖子根本不存在一样。这可以是一个很好的策略,可以避免让攻击者枚举您的数据库中的哪些帖子。