【发布时间】:2022-01-19 20:40:12
【问题描述】:
我在一个方法上有两个回调,这是我的代码:
before_action :set_foo, only: :foo
before_action -> {set_bar @bar }, only: :foo
def foo; end
无论如何我可以缩短它以便我只需要调用一次 before_action 吗?
【问题讨论】:
标签: ruby-on-rails ruby callback tdd dry
我在一个方法上有两个回调,这是我的代码:
before_action :set_foo, only: :foo
before_action -> {set_bar @bar }, only: :foo
def foo; end
无论如何我可以缩短它以便我只需要调用一次 before_action 吗?
【问题讨论】:
标签: ruby-on-rails ruby callback tdd dry
您可以将多个“名称”传递给before_action:
before_action :set_foo, -> { set_bar @bar }, only: foo
before_action(在这种情况下为only: :foo)的选项适用于所有“名称”。文档明确说明了“名称”可以是什么,但是,就像 Rails 中的其他回调一样,它们可以是任何“可调用”的东西:方法名称、procs、lambdas、...
【讨论】:
before_action(names,block) 的签名,但实际签名是before_action(*names,&blk),这使得它接受多个名称和一个可选块更加明显。即使“名称”意味着多个,我也会根据记录的签名假设这将是 before_action [:set_foo,-> { set_bar @bar }] 并且我不知道如何传递选项,因为看起来第二个参数是 a) 强制性的; b) 位置。不过这个答案是绝对正确的
->{}.class 说Proc 和's'.method(:length).class 说Method 所以是的。除非我误解了这个问题。