私が正しく理解していれば、あなたが望むのは次のように書けることです:
link_to 'students', students_path
現在のユーザーに基づいて部門オプションが自動的に設定されます。
これまでに提供された他のソリューションと同様のソリューションを次に示します。部門を必要とする各ルートのヘルパーを定義します。ただし、これはプログラムで行うことができます。
どうぞ:
app/helpers/url_helper.rb
module UrlHelper
Rails.application.routes.routes.named_routes.values.
select{ |route| route.parts.include?(:department) }.each do |route|
define_method :"department_#{route.name}_path" do |*args|
opts = args.extract_options!
if args.size > 0
keys = route.parts - [:department]
opts.merge!(Hash[*keys.zip(args).flatten])
end
opts.reverse_merge!(department: current_user.department.name.downcase)
Rails.application.routes.url_helpers.send(:"#{route.name}_path", opts)
end
end
end
これで、パス セグメントを持つすべてのルートのようなヘルパー メソッドがdepartment_students_path
できました。これらは同じように機能します -- opts を渡すことができ、明示的に設定することもでき、デフォルトを上書きします。また、メンテナンスをしなくても、変更が反映された最新の状態を維持できます。:department
students_path
:department
routes.rb
元のヘルパーと同じ名前を付けることもできます。つまり、
define_method :"#{route.name}_path"
それらにプレフィックスを付ける必要なしに --department_
私はそうしませんでした。なぜなら、そのような名前の衝突を避けたいからです。それがどのように機能するかはわかりませんが (ビュー テンプレートから呼び出したときにどのメソッドがメソッド ルックアップを獲得するか)、調べてみてください。
もちろん、ヘルパー メソッドに対してこのブロックを繰り返すことができる_url
ので、ヘルパー メソッドに加えてそれらを使用できます_path
。
ビューだけinclude UrlHelper
でなくコントローラーでもヘルパーを使用できるようにするには、ApplicationController
.
だから私はこれがあなたの基準を満たしていると思います:
:department
スコープが の部門にデフォルト設定されるパスのヘルパー メソッドを呼び出すことができるcurrent_user
ため、これを毎回明示的に指定する必要はありません。
- ヘルパーは、セグメントを持つ実際に定義された名前付きルートに基づいてメタプログラミングによって生成される
:department
ため、それらを維持する必要はありません。
- ビルトインの Rails url_helpers のように、これらの人は他のパス セグメントの位置引数を取ることができます
department_student_path(@student)
。ただし、1 つの制限として、部門をオーバーライドする場合は、最終的な opts ハッシュ ( ) でオーバーライドする必要がありますdepartment_student_path(@student, department: 'math')
。繰り返しになりますが、その場合はいつでも を実行できるstudent_path('math', @student)
ので、それほど制限はないと思います。