如何在Rails中实现删除帖子而不是其他用户帖子

时间:2017-01-23 17:42:04

标签: ruby-on-rails

让我们开始吧,我刚开始编写rails并尝试通过构建项目来学习。我正在创建一个具有类似于twitter的跟随和跟随功能的项目...我已经实现了删除帖子的选项。但是,似乎我可以删除其他人发布以及我正在关注等。我如何实现删除我自己的帖子,并让其他用户有能力编辑修改和删除自己的帖子。

post.rb

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  

3 个答案:

答案 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,就好像该帖子根本不存在一样。这可以是一个很好的策略,可以避免让攻击者枚举您的数据库中的哪些帖子。