2015-02-09 71 views
0

我正在使用RoR 4和Devise gem進行用戶驗證。我希望用戶能夠編輯他們自己的內容,而不是其他人的內容。 authenticate_user方法似乎只能確保用戶在可以編輯內容之前登錄。但是另一個用戶可以註冊並編輯其他人的內容。只允許用戶編輯自己的內容

我的控制器看起來像:

class PrayersController < ApplicationController 
    before_action :find_prayer, only: [:show, :edit, :updated, :destroy] 
    before_action :authenticate_user!, except: [:index, :show] 

    def index 
    @prayers = Prayer.all.order("created_at DESC") 
    end 

    def show 
    end 

    def new 
    @prayer = current_user.prayers.build 
    end 

    def edit 
    end 

    def create 
    @prayer = current_user.prayers.build(prayer_params) 

     if @prayer.save 
     redirect_to @prayer, notice: "Successfully created prayer" 
     else 
     render 'new' 
     end 
    end 

    def update 
     @prayer = Prayer.find_by_id(params[:id]) 

     if @prayer.update(prayer_params) 
      redirect_to @prayer, notice: "Prayer was successfully updated" 
     else 
      render 'edit' 
     end   
    end 

    def destroy 
    @prayer.destroy 
    redirect_to root_path 
    end 

    private 
    def prayer_params 
     params.require(:prayer).permit(:title, :body) 
    end 

    def find_prayer 
     @prayer = Prayer.find(params[:id]) 
    end 
end 

我試圖讓自己的before_action看起來是這樣的:

def own_prayer 
    if !current_user == Prayer.current_user 
    redirect_to @prayer, notice: "You cannot edit this prayer" 
    end 
end 

但沒有奏效。我可以通過類似的操作通過視圖限制對錶單的訪問,但我不認爲這是完全安全的?

謝謝

回答

1

我猜你不上課方法current_userPrayer類。您的用戶模型中似乎還有has_many :prayers。因此,要獲得禱告的用戶,您需要在禱告實例變量上調用user方法。

這應該是這樣的:

@prayer = Prayer.find params[:id] 

unless current_user == @prayer.user 
    redirect_to(@prayer, notice: "You cannot edit this prayer") and return 
end 

如果您需要更多棘手的限制規則,然後使用cancan gem

+0

非常感謝你。這會在我的prayers_controller的更新方法中進行嗎? – Tom 2015-02-09 22:47:28

+1

我想你也需要限制編輯方法,所以你可以在上面的代碼中添加'before_filter own_prayer,只有:[:edit,:update]'方法。然後,從更新方法 – 2015-02-10 03:52:03

+0

中刪除'@prayer = Prayer.find_by_id(params [:id]) '這就像一種享受。 – Tom 2015-02-10 10:48:22

相關問題