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 に答える