带有传递参数的rails中的around_action?

时间:2016-05-17 06:44:34

标签: ruby-on-rails ruby

如何在接受参数的Rails中调用around_action

around_action only: [:follow] do
 set_follow_source(@source)
end

def set_follow_source
   puts 'before'
   yield
   puts 'after'
end

4 个答案:

答案 0 :(得分:1)

我必须澄清你的问题。到底由谁或什么组件来设置此参数?

如果想要创建一些DSL以便事先为周围动作设置参数,则可以执行以下操作:

def self.say_hello_to(name)
  lambda do |controller, block|
    hello name, &block
  end
end

around_action say_hello_to('smith'), only: :index

def index
end

private

def hello(name, &block)
  puts 'hello'
  yield
  puts name
end

答案 1 :(得分:0)

TL; DR :没办法。

around_action只是对被包装方法的调用的aspect。也就是说,它将链接到由此控制器的rails调用的方法链中。在伪代码中:

around_action only: [:follow] { puts 'around' }

或多或少与:

相同
def follow
  puts 'around'
  # .... the code of follow method
  puts 'around'
end

您认为将参数传递给它的人是谁?

您提供的代码有更多故障:set_follow_source调用yield而不检查block_given?,并且实际上没有给出阻止,这将导致{{1}错误被抛出。

您要传递的参数是控制器实例变量,可以从此控制器中的任何方法完全访问。为什么需要将其作为参数传递?

我认为你应该考虑澄清你想要完成的事情。

答案 2 :(得分:0)

实际上,它已经接受了一些参数,你可以在动作过滤器回调中访问控制器实例作为参数, 像这样:

around_action only: [:follow] do |controller, block|
  controller.send(:any_method); 
  block.call # or yield
end

看起来在Rails中做这种事情是可以的, 你可以在Rails docs paragraph 8.2

中找到类似的例子

答案 3 :(得分:0)

这是可能的,以下是来自 Rails code 的示例:

 set_callback :save, :around, ->(r, block) { stuff; result = block.call; stuff }

所以你只需要像这样将块传递给你的周围过滤器:

around_action only: [:follow] do |_, blk|
 set_follow_source(@source, &blk)
end

def set_follow_source
   puts 'before'
   yield
   puts 'after'
end