给出
# 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'])
。
没有干净的方法可以将变量从约束携带到控制器。
[肮脏的方法是直接在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_
,所以您永远不会与适当的请求变量发生冲突。
绝对不建议用于生产,但这是一个有趣的练习。