Rails:使用参数从before过滤器调用函数

时间:2012-10-25 16:12:36

标签: ruby-on-rails before-filter

我正在尝试使用之前的过滤器来阻止未经批准的用户访问页面。

要检查未经批准的用户,我在/ lib文件夹中的.rb文件中定义了一个方法(我有几种方法,我在各种控制器和视图中)。方法是check_user_for_current_approval(user_id)。

在我的控制器中,我尝试了以下变体(注意我使用RubyMine作为IDE,它没有给我一个表明我有语法错误的指示):

before_filter(:only => [:new]) do |c|
    c.check_user_for_current_approval current_user.id
end

这给了我以下错误消息:

NoMethodError in PaymentsController#new

private method `check_user_for_current_approval' called for #<PaymentsController:0x007ff06784f148>

以下语法:

before_filter(:only => [:new]) do |c|
    c.send (:check_user_for_current_approval, current_user.id)
end

产生此错误:

SyntaxError in PaymentsController#new

/app/controllers/payments_controller.rb:9: syntax error, unexpected ',', expecting ')'
c.send (:check_user_for_current_approval, current_user.id)
                                         ^
/app/controllers/payments_controller.rb:9: syntax error, unexpected ')', expecting keyword_end
/app/controllers/payments_controller.rb:130: syntax error, unexpected $end, expecting keyword_end

使用以下语法:

before_filter(:only => [:new]) { check_user_for_current_approval(current_user.id) }

带我直接进入页面(过滤器无效)。不同的陈述来自我在StackOverflow上看到的答案。

2 个答案:

答案 0 :(得分:1)

使用您的第一种方法,但公开check_user_for_current_approval

此外:

我认为共享before_filter更适合应用程序控制器,而不是lib文件。 这将使扩展应用程序控制器的所有控制器都可以访问它,通常所有其他控制器都可以这样做。

答案 1 :(得分:0)

为什么不使用符号来定义要调用的方法?

e.g。 PaymentsController:

before_filter :check_user_for_current_approval, :only => :new

def check_user_for_current_approval; raise "Called"; end