2011-07-14 38 views
0

在我的测试之前,我这样做:回报率:过滤器返回false并不停止动作形式运行

 delete :destroy, :id => p.id 
    assert_equal "You do not have permission to delete this Object.", flash[:error] 
    Object.find_by_id(p.id).should_not be_nil #line 48 (reffed by console output below) 

和我的前过滤器,有一个看跌期权,所以我知道结果是假的,并没有按” t请根据此页面返回

before_filter lambda { |controller| 
     result = controller.is_object_on_same_account_as_current_account_for_id?(
        controller_name.classify.constantize, 
        controller.params[:id]) 
     puts result 
     return if result 
    }, :only => [:destroy] 

http://citizen428.net/archives/846,通过过滤器限制的行动只有当过滤器返回执行。

,这里是控制台输出:

Started 
false 
F 
Finished in 0.865708 seconds. 

    1) Failure: 
test: .... ... 
blah blah, issue is on line 48 

    shoulda (2.11.3) lib/shoulda/context.rb:382:in `...']: 
expected: not nil 
    got: nil 

所以......这到底是怎么回事呢?我完全无能为力。

相关代码:

破坏方法:

def destroy 
    @content.destroy 

不是,那我只运行一个测试。

+0

点出这是错误的代码,并提供更多的细节* *。 –

+0

我做了,第48行。 – DerNalia

回答

4

根据官方Rails Docs,停止执行操作的正确方法是使用before_filter实际上是在过滤器中重定向或呈现。

所以你可能想:

before_filter lambda { |controller| 
     result = controller.is_object_on_same_account_as_current_account_for_id?(
        controller_name.classify.constantize, 
        controller.params[:id]) 
     puts result 
     if !result 
     flash[:error] = "You do not have permission to delete this Object." 
     redirect_to "/" # or wherever you want to redirect to 
     end 
    }, :only => [:destroy] 
+0

如果我的应用程序使用ajax功能相当强大,并且不会沿着重定向的路线做什么? Anywho,我尝试在那里添加一个redirect_to ...它说它是未定义的。我正在使用rails 2.3.8 – DerNalia

+0

@DerNalia - 看起来你需要使用'controller.redirect_to',因为你在这个lambda中。还有[head](http://rails.rubyonrails.org/classes/ActionController/Base.html#M000466)方法,它可能对您的AJAX更好。干杯! –

+0

当我做控制器。 ,我得到这个:NoMethodError:受保护的方法'redirect_to'调用 – DerNalia