2013-11-01 31 views
0

以下是標準posts#create操作(app/controllers/posts_controller.rb)。在控制器級別,如何防止匿名用戶發佈?

在控制器級別,我想阻止匿名用戶(未登錄的用戶)能夠保存帖子。作爲次要目標,如果用戶未登錄,我甚至不想執行Post.new這一行。我想知道完成此操作的最佳做​​法是什麼。

此外,作爲一個附註,我不確定如何編寫響應的json部分。如果我使用HTML環境中的警告消息進行重定向,那麼在JSON世界中迴應什麼會是件好事?

def create 

    @posting = Post.new(posting_params) 

    respond_to do |format| 

    if @posting.save 
     format.html { redirect_to @posting, notice: 'Post was successfully created.' } 
     format.json { render action: 'show', status: :created, location: @posting } 
    else 
     format.html { render action: 'new' } 
     format.json { render json: @posting.errors, status: :unprocessable_entity } 
    end 
    end 
end 

暫時我在下面的代碼行,以上Post.new行:

redirect_to home_path, warning: 'You must be logged in to post.' and return unless user_signed_in? 

我想另一種選擇是一樣的東西下面,放置上述if @posting.save線。但是,真的,我期待看看其他人會做什麼。

unless user_signed_in? 
    format.html { redirect_to home_path, alert: 'You must be logged in to post.' and return } 
    format.json { render json: .....not sure what to put here..... } 
end 

您的建議非常感謝。

+0

您是否使用了認證庫像設計?簡而言之,使用'before_filter'確保登錄並且僅適用於某些操作,比如'before_filter:ensure_logged_in,只:[:new,:create,:destroy]' –

回答

1

一個before_filter有利於這樣的事情:

before_filter :confirm_user_signed_in, only: [:new, :create] 

def confirm_user_signed_in 
    unless user_signed_in? 
    respond_to do |format| 
     format.html { redirect_to home_path, alert: 'You must be logged in to post.' and return } 
     format.json { render json: .....not sure what to put here..... } 
    end 
    end 
end 

至於呈現什麼在JSON場景中,您可以根本不呈現任何內容,但是會顯示403(禁止)狀態。您可以選擇包含一些數據來解釋403發生的原因,但沒有關於數據如何顯示的標準。一些框架(骨幹,我認爲)將尋找包含errors鍵的散列,可以將其設置爲原因。

喜歡的東西:

format.json { render json: { errors: ["Login required."] }, status: 403 } 
1

更好的做法是以前像這樣的行動過濾器和提列表中使用:

before_filter :require_login, :only => [:new, :create] 
1

嘗試使用康康舞寶石。您不僅可以防止發佈不需要的用戶,還可以執行各種其他權限,這些權限不會使控制器膨脹。這些權限由您在名爲ability.rb的單獨文件中定義。

cancan Railscast

cancan Github

相關問題