限制编辑路线 - 除非符合条件

时间:2015-07-06 02:47:49

标签: ruby-on-rails

所以我正在制作一个视频游戏评论网站进行练习 - 而我想要完成的想法是:

您只能查看一次视频游戏

BUT

发布有关该游戏的新文章时,您可以编辑和更改您的评论,直到再次发布其他文章。

目前,我有这个逻辑隐藏并显示编辑链接 - 但当然,路线仍处于活动状态。

如果没有添加新文章,如何限制编辑路线?

下面是逻辑,后面是路线。如果您需要其他文件,请告诉我。提前致谢

这种方式的工作方式是 - 如果最后一次新闻对象是在您的评论上次更新后创建的 - 那么您可以看到编辑评论的链接。

<% 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 个答案:

答案 0 :(得分:2)

如果您希望用户“只审核一次视频游戏”,我建议您在app / models / 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

答案 1 :(得分:1)

当没有新闻时我隐藏链接你可以使用下面的代码。此外,无需调用用户的ID并进行比较,您可以直接执行==,如下所示。

<% if !@news.empty? 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 %>