Rails 3 Resource routing for join models

2019-08-05 10:17发布

问题:

I have a many-to-many relationship between users and teams (as a has_many :through), and I'm trying to setup a "team members" join model as a resource in the routes.

In my layouts I've setup a "team context form" that sets a session variable for the current_team, and I want the route for the team_members resources to be defined as /team_members/:user_id/show. Is there any way to do this with the resources :team_members in routes.rb?

I've tried using :path_names => {:action => "\some\url"}, however for actions that require an :id the router appends the route to be something like "\:id\some\url"

回答1:

edit: If you want to be able to edit the team membership, you could have

resources :users do
    resources :team_members
end

and then, to edit the membership => /users/:user_id/team_members/:id/edit

And then you can do whatever you want in the team_members_controller.

Or as numbers1311407 said, just resources :team_members and you'll have all the rest routes to work with the team memberships.


Really don't want the standard /teams/:team_id/users/:id ?

If you really want /team_members/:user_id/show You could just do

get "/team_members/:id/show" => "users#show"

But I dont think it's a good idea.



回答2:

I wonder if what you're looking for is:

resource :team_members do
  resources :users
end

The "resource" command creates a route where team takes no :id and would allow you to look up the team using your current_team session variable.

You'd get these path in your app:

/team_members            #  team_members#show
/team_members/users      #  users#index
/team_members/users/:id  #  users#show

In each case you're responsible for looking up current_team.



回答3:

if the relationship is many-to-many then the route you're looking to write doesn't reference the team, unless this show page is intended to show all teams a user belongs to?

This would work out of the box if you assigned an ID to the join model and simply used its natural GET route, e.g. /team_memberships/:id

Edit: sorry I didn't read the 2nd paragraph carefully, if you are storing the team in the session you could (as suggested by someone else) set up team_members as a singleton resource and pull the team from the session when getting the member.

If it works in the app, though, considering team_membership as its own resource is probably more naturally RESTful.