从路由到控制器的高级约束传递变量

问题描述 投票:0回答:1

给出

# routes.rb
get ':friend_slug', to: 'friend#show', constraints: FriendConstraint.new

# friend_constraint.rb
def matches?(request)
  friend = Friend.find_by(slug: request.params['friend_slug'])
  friend.present?
end

由于我已经查找并在路由约束中包含friend,如何为控制器保存/传递变量friend以避免重复查找?

当前,我正在执行完全相同的一行,即控制器中的Friend.find_by(slug: request.params['friend_slug'])

ruby-on-rails optimization routing
1个回答
0
投票

没有干净的方法可以将变量从约束携带到控制器。

[肮脏的方法是直接在request对象上设置实例变量。

# friend_constraint.rb
def matches?(request)
  friend = Friend.find_by(slug: request.params['friend_slug'])

  return false if friend.blank?

  request.instance_variable_set('@namespace_friend', friend)
end

# friends_controller.rb
...
friend = request.instance_variable_get('@namespace_friend')
...

@namespace_,所以您永远不会与适当的请求变量发生冲突。

绝对不建议用于生产,但这是一个有趣的练习。

© www.soinside.com 2019 - 2024. All rights reserved.