如何在接受参数的Rails中调用around_action
?
around_action only: [:follow] do
set_follow_source(@source)
end
def set_follow_source
puts 'before'
yield
puts 'after'
end
答案 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