などの 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
ありがとう!