Ruby on Rails: 2.3.8, пользовательские до того, как фильтры не работают? - PullRequest
0 голосов
/ 14 июля 2011

Итак, я пытался настроить before_filter для проверки разрешений на предмет того, может ли кто-либо удалить объект. Но это не сработало ... в конце концов я делаю следующее:

   before_filter :test_hack, :only => :destroy

  def test_hack
    return false
  end

метод уничтожения здесь:

def destroy
    @content = Content.find(params[:id])

#will get rid of this when the before filter works...
# but this doesn't stop it from getting deleted either
    if not has_permission_to_change?(@content) 
      puts "This content is not gonig to get deleted"   
      flash[:error] = 'You do not have permission to delete this content.'
    else
      @content.destroy
    end

провальный тест:

   should "not allow the deleting of #{plural_name} on different accounts" do
      login_as(@user)
      p = Factory(factory_name, :account => Factory(:account))

      assert_difference("#{klass}.count", 0) do
        begin
          delete :destroy, :id => p.id
          raise "program flow should not reach this message"
        rescue ActiveRecord::RecordNotFound
          assert true
        end
      end

Контент принадлежит к аккаунту

вывод на консоль:

Loaded suite test/functional/contents_controller_test
Started
This content is not gonig to get deleted 
E
Finished in 0.649422 seconds.

  1) Error:
test: destroy contents! should not allow the deleting of contents on different accounts. (ContentsControllerTest):
RuntimeError: program flow should not reach this message

Ответы [ 2 ]

1 голос
/ 14 июля 2011

Еще раз , поведение вашего теста абсолютно нормальное:

Ваша строка raise "program flow should not reach this message" будет ВСЕГДА выполняться, так как есть объект с id, который вы передаете: вытолько что создал

Вы должны просто сохранить:

 assert_difference("#{klass}.count", 0) do
   delete :destroy, :id => p.id
  end

И я не вижу, где ваша before_filter полезна здесь

1 голос
/ 14 июля 2011

В вашем тесте

delete :destroy, :id => p.id

не вызовет никаких исключений, поэтому выполнение продолжается нормально, достигнув следующей строки

raise "program flow should not reach this message"

, и тест не пройден, потому что этоне пойманBefore_filter не имеет к этому никакого отношения, согласно вашему тесту, он даже не вызывается.

...