2015-07-06 70 views
0

所以我正在練習一個視頻遊戲評論網站 - 和我試圖完成的理念是:限制編輯路線 - 除非條件滿足

只能查看視頻遊戲一次

當關於遊戲的一個新的新聞文章發佈後,您可以編輯和更改您的評論,直到另一篇文章再次發表。

目前,我有這個隱藏和顯示編輯鏈接的邏輯 - 但當然,路線仍然是活動的。

如何在不添加新文章時限制編輯路線?

下面是邏輯,其次是路由。如果您需要其他文件,請讓我知道。在此先感謝

這種工作方式是 - 如果最後一個新聞對象是在您的評論上次更新後創建的 - 那麼您可以看到編輯您的評論的鏈接。

<% if @news.last.created_at > preview.updated_at && preview.user_id == current_user.id %> 
    <p><%= link_to "edit", edit_game_preview_path(@game.id, preview.id) %></p> 
<% end %> 

的routes.rb

Rails.application.routes.draw do 

    devise_for :users 

    root "games#index" 

    resources :games do 
    resources :news 
    resources :reviews, except: [:show, :index] 
    resources :previews, except: [:show, :index] 
    end 

    resources :platforms 
    resources :genres 

end 

回答

2

如果你想有用戶「只審查視頻遊戲一次」,我建議你在另外的應用程序/模型/ review.rb(here's more info on validates_uniqueness_of)以下模型驗證,只是隱藏「編輯「鏈接。

validates_uniqueness_of :user_id, scope: :game_id. 

你需要限制無論是「編輯」頁面和「更新」行動,以滿足您的需求,但我不明白的地方「預覽」進來,

我可以編輯我的答案是,如果你可以解釋「預覽」,但是這裏的代碼允許用戶「編輯和更改他們的評論,直到另一篇文章發表」。

class ReviewsController < ApplicationController 
    before_filter :restrict_access_modify, :only => [:edit, :update] 

    ... 

    private 

    def restrict_access_modify 
    # Make sure that Reviews.find(params[:id]) isn't repeated. 
    @review = current_user.reviews.find(params[:id]) 
    redirect_to(:back, notice: "A new article has already need posted") if News.last.id > @review.new_id 
    end 
end 
+0

非常感謝sooo。這是完美的和有效的。預覽只是遊戲發佈前的評論。一旦它發佈,你可以留下評論:)所以基本上我創建了2個階段 - 預覽階段和審查階段。如果'Time.now giantqtipz

+0

有關使用狀態機的任何意見?您可以使用它來控制用戶正在採取的操作並自動觸發要採取的操作(例如:Tweet或電子郵件)。 –

1

我隱藏的鏈接時,沒有消息就是在那裏,你可以使用下面的代碼。也不需要調用用戶的id並進行比較,你可以直接做==如下。

<% if [email protected]? and @news.last.created_at > preview.updated_at && preview.user == current_user %> 
    <p><%= link_to "edit", edit_game_preview_path(@game.id, preview.id) %></p> 
<% end %> 
+0

非常感謝。沒有ID就更清潔了。並不知道.empty?方法。相反,我使用'@news.count == 0',它也可以工作,但不乾淨。 – giantqtipz

+0

但我如何限制編輯路線,雖然:) – giantqtipz

+0

你不限制路線,你限制控制器的行動。 – max