I would like to contribute to Rails. Specifically I’d like to add a feature, and before I write any code I’d like to receive some feedback from you guys.
When using Single Table Inheritance, all path/url helpers for the parent resource will not work for the child resources. For example:
class User < ActiveRecord::Base
end
class Student < User
end
class Professor < User
end
u = User.create
s = Student.create
p = Professor.createlink_to ‘User’, u # user_path(u)
link_to ‘Student’, s # student_path(s)
link_to 'Professor, p # professor_path§form_for u # user_path(u)
form_for s # student_path(s)
form_for p # professor_path§
Let’s see what happens when I add a nested resource named posts to User
class User < ActiveRecord::Base
has_many :posts
endform_for [ u, Post.new ] # user_posts_path
form_for [ s, Post.new ] # student_posts_path
form_for [ p, Post.new ] # professor_posts_path
It might look good and obvious, but now see the routes:
resources :users do
resources :posts
end
resources :students do
resources :posts
end
resources :professors do
resources :posts
end
And if I add other nested resources the repetition will grow larger and larger. On StackOverflow I was answered to use a loop
[ :users, :students, :professors ].each do |name|
resources name do
resources :posts
end
end
While this might be the intended behaviour, I can’t see a reason why the nested post route needs to have 3 helpers when it is owned from the parent. I was also suggested to use the url option in form_for to specify the parent path. However this will not work when polymorphic associations are used.
My solution? Instead of creating tons of unnecessary paths, extend the :as option of resources to be an Array, and allow many path helpers to be mapped to the same route. So that we can write:
resources :user, as: [ ‘users’, ‘students’, ‘professors’ ] do
resources :posts
end
This code should generate all the set of routes for the users resources. And generate 3 sets of path helpers. users_path, students_path and professors_path will all point to /users for example.
Do you think this will be useful to someone other than me? Do you believe that DHH would allow such a thing ?
Thank you for your attention.