Я считаю, что правильнее всего было бы проверить это в контроллере. Я бы создал фильтр до этого случая
UPDATE:
Просто в качестве быстрого примера:
before_filter :valid_vote, :only => :update
def update
@vote.update_attributes(params[:vote]) # or whatever
end
..
private
def valid_vote
@vote = Vote.find params[:id]
unless ( @vote.video.user.id != current_user.id )
render :text => 'You can't vote for your own video', :status => 403
end
end
Таким образом, @vote объявляется и проверяется перед обработкой вашего действия 'update'.
Если он недействителен, то ваше действие по обновлению остается без изменений
ОБНОВЛЕНИЕ 2:
не знаю, как вам это понравится, но вы также можете сделать следующее:
в модели голосования:
attr_accessor :skip_timeline
затем используйте концепцию с фильтром before, но сделайте @vote.skip_timeline = true
вместо рендеринга текста
тогда утверждение может выглядеть следующим образом:
:if => lambda { |vote| ((vote.value == 1) || (vote.value == -1)) && !vote.skip_timeline }
Вы также можете переместить ((vote.value == 1) || (vote.value == -1))
к фильтру до:
def valid_vote
@vote = Vote.find params[:id]
unless ( [1,-1].include? @vote.value && @vote.video.user.id != current_user.id )
@vote.skip_timeline = true
end
end
и
: if => lambda {| голос | ! voice.skip_timeline}