2

我经常围绕 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.

谢谢!

4

1 回答 1

3

我不这么认为,但你可以自己写(注意没有爆炸“!”有不同的方法名称):

def extract_options
  last.is_a?(::Hash) ? last : {}
end

或者你可以extract_option!从一个副本中保留你的原件args不变

def wrapper_link_to(wrapper_arg, *args, &blk)
  options = args.dup.extract_option!(:wrapper_option)
  ...
end
于 2013-05-23T23:09:54.883 回答