在 Rails 控制器操作上设置多个回调
Posted
技术标签:
【中文标题】在 Rails 控制器操作上设置多个回调【英文标题】:Set multiple call backs on rails controller action 【发布时间】:2022-01-19 20:40:12 【问题描述】:我在一个方法上有两个回调,这是我的代码:
before_action :set_foo, only: :foo
before_action -> set_bar @bar , only: :foo
def foo; end
无论如何我可以缩短它以便我只需要调用一次 before_action 吗?
【问题讨论】:
【参考方案1】:您可以将多个“名称”传递给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) 位置。不过这个答案是绝对正确的
@engineersmnky 您可以在“我希望文件更清晰一点”之后加上句号(甚至是感叹号)。很多 Rails 都在摆弄东西,看看什么是有效的,并阅读源代码来填补缺失的部分。 OTOH,我还没有提交任何拉取请求来充实文档,所以......
在一个稍微不相关的注释中,方法/函数是另一个 Ruby 类的实例吗?
@CJG ->.class
说Proc
和's'.method(:length).class
说Method
所以是的。除非我误解了这个问题。以上是关于在 Rails 控制器操作上设置多个回调的主要内容,如果未能解决你的问题,请参考以下文章
在 Rails 控制器中,即使使用 json 响应也设置通知