2017-01-23 50 views
1

讓我開始吧,我是新手,在rails中編程並試圖通過構建項目來學習。我正在創建一個項目,它具有類似於Twitter的關注和跟隨者功能...我已經實施了刪除帖子的選項。但是,似乎我可以刪除其他人張貼以及我正在關注等。我如何實現刪除我自己的帖子,並讓其他用戶有能力編輯修改和刪除自己的帖子。如何在Rails中實現刪除你的帖子而不是其他用戶帖子

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 
+0

我想說謝謝所有你! –

回答

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 %> 
+0

是的,這是我做了類似於這.... ....我選擇做的也是隱藏按鈕,如果評估是錯誤的...非常感謝 –

+0

@Randymangal如果這個答案有幫助,請接受它作爲正確的答案,非常感謝 –

-1

好問題,雖然沒有一個答案我可以給你。在您的應用程序中「授權」行爲的問題是一個很大的問題,並且有像Pundit這樣的寶石,您可以考慮尋找一個完善的解決方案。

然而,從自己的基礎開始並開始構建更大的解決方案總是很好的。你已經沒有錯 - 只需要將before_action :owned_post, only: [:delete](可能重命名爲ensure_post_owner等)添加到你的控制器來執行你的規則。

另一種方法是將ActiveRecord查詢範圍限制爲允許當前用戶操作的對象集合。所以,而不是@post = Post.find(params[:id]),你可以這樣做,@post = current_user.posts.find(params[:id])。如果用戶試圖修改他們不擁有的帖子,他們將返回404,就好像該帖子根本不存在一樣。這可能是一個很好的策略,可以避免讓攻擊者列舉哪些帖子是和不在您的數據庫中。

+0

謝謝您花時間幫忙 –

0

上查看指定這樣的東西:

<% if user_signed_in? && current_user.id == @post.user_id %> 
# something like edit. links... delete links.. 
<% end %> 

,或者您也可以使用寶石,如:cancancan