我经常围绕 Rails 助手编写包装器,例如#link_to
. 所以,我想将大部分参数传递给实际的 Rails 助手,如下所示:
def wrapper_link_to(*args, &blk)
ActionController::Base.helpers.link_to(*args, &blk)
end
因为我不想重新实现#link_to
(#content_for
或更低)已经完成的所有很酷的东西。
有没有办法在传递某些论点*args
之前把它拉出来?这样我就可以只与包装方法关心的参数进行交互,并且仍然保持所有其余的#link_to
工作?
我想做这样的事情:
def wrapper_link_to(wrapper_arg, *args, &blk)
options = args.extract_option!(:wrapper_option) # extract_options! would normally clear out args
if options[:wrapper_option]
# do stuff
end
ActionController::Base.helpers.link_to(wrapper_arg || other_stuff, more_stuff, *args, &blk) # *args will now be the original *args, but without :wrapper_option
end
现在,我已经复制了#extract_options 的逻辑!并做了一个丑陋的方法,就像:
def extract_option(arg, args)
if args.last.is_a?(Hash) && args.last.extractable_options?
args_hash = args.pop
args_value = args_hash.extract!(arg)[arg]
return args_value, [args_hash]
else
return nil, args
end
end
是否已经有 Ruby 或 Rails 方法可以执行类似的操作?
最终,如果:
wrappper_option_value = args.extract_option!(:wrapper_option)
将修改args
为:wrapper_option
删除并返回:wrapper_option
.
谢谢!