2015-07-06 4 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

спасибо, что так много. это прекрасно и работает. предварительные просмотры - это только комментарии, которые вы можете сделать до публикации игры. после его публикации вы можете оставить отзывы :), так что в основном я создал 2 фазы - фазу предварительного просмотра и фазу обзора. фазы определяются, если 'Time.now giantqtipz

+0

Любые мнения об использовании конечного автомата? Вы можете использовать его для управления действиями пользователей и автоматического запуска действий, которые необходимо предпринять (например: Tweet или электронная почта). –

1

я, чтобы скрыть ссылку, когда нет новостей не есть вы можете использовать код, приведенный ниже. Также нет необходимости вызывать идентификатор пользователя и сравнивать, вы можете сделать direct ==, как показано ниже.

<% 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. и не знал о пустом? метод. вместо этого я использовал '@news.count == 0', который тоже работает, но не чист. – giantqtipz

+0

, но как я могу ограничить маршрут редактирования, хотя :) – giantqtipz

+0

Вы не ограничиваете маршрут, вы ограничиваете действие контроллера. – max

Смежные вопросы