Nếu tôi hiểu chính xác, những gì bạn muốn là có thể viết:
link_to 'students', students_path
và có tùy chọn bộ phận được đặt tự động dựa trên người dùng hiện tại.
Đây là giải pháp giống như một số giải pháp khác đã được cung cấp: xác định người trợ giúp cho mỗi tuyến đường yêu cầu một bộ phận. Tuy nhiên, chúng ta có thể làm điều này theo lập trình.
Ở đây chúng ta đi: 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
Bây giờ bạn có phương pháp helper như department_students_path
cho mỗi tuyến đường mà có một phân khúc :department
con đường. Chúng sẽ hoạt động giống như students_path
- bạn có thể chuyển sang các opts, thậm chí bạn có thể đặt rõ ràng :department
và nó sẽ ghi đè lên mặc định. Và họ luôn được cập nhật với những thay đổi đối với routes.rb
của bạn mà không cần phải duy trì nó.
Bạn thậm chí có thể có thể để đặt tên họ giống như những người giúp đỡ ban đầu, tức là,
define_method :"#{route.name}_path"
mà không cần phải thêm tiền tố họ với department_
--Tôi không làm điều đó bởi vì tôi thà tránh va chạm đặt tên như thế. Tôi không chắc làm thế nào mà sẽ làm việc (mà phương pháp sẽ giành chiến thắng tra cứu phương pháp khi gọi nó từ một mẫu xem), nhưng bạn có thể nhìn vào nó.
Tất nhiên, bạn có thể lặp lại khối này cho các phương pháp trợ giúp _url
, vì vậy bạn sẽ có những phương thức đó ngoài các số _path
.
Để giúp người trợ giúp có mặt trên bộ điều khiển cũng như chế độ xem, chỉ cần include UrlHelper
trong số ApplicationController
của bạn.
Vì vậy, tôi nghĩ rằng đây đáp ứng tiêu chí của bạn:
- Bạn có thể gọi một phương thức helper cho các đường scoped để
:department
đó sẽ mặc định các bộ phận của current_user
, do đó bạn không cần phải xác định rõ ràng này mỗi lần.
- Người trợ giúp được tạo thông qua lập trình meta dựa trên các tuyến đường được xác định thực sự có phân đoạn
:department
, do đó bạn không phải duy trì chúng.
- Giống như url_helpers đường ray tích hợp, những kẻ này có thể lấy arg vị trí cho các đoạn đường dẫn khác, như,
department_student_path(@student)
. Tuy nhiên, một hạn chế là nếu bạn muốn ghi đè lên bộ phận, bạn cần phải làm như vậy trong băm opts cuối cùng (department_student_path(@student, department: 'math')
). Sau đó, một lần nữa, trong trường hợp đó bạn luôn có thể làm student_path('math', @student)
, vì vậy tôi không nghĩ rằng đó là một giới hạn.
số 'current_user', mà là một phương pháp của bộ điều khiển của bạn, không tồn tại cho đến khi định tuyến đã được thực hiện và một bộ điều khiển/hành động đã được chọn và một bộ điều khiển đã được khởi tạo. – meagar
Nếu điều này là không thể, thì làm thế nào tôi có thể khắc phục vấn đề của mình. Tôi đã cập nhật câu hỏi của mình với các chi tiết khác. –