【问题标题】:Rails 3 Resource routing for join modelsRails 3 连接模型的资源路由
【发布时间】:2011-08-10 15:42:02
【问题描述】:

我在用户和团队之间存在多对多关系(作为 has_many :through),我正在尝试将“团队成员”加入模型设置为路线中的资源。

在我的布局中,我设置了一个“团队上下文表单”,它为current_team 设置了一个会话变量,并且我希望将 team_members 资源的路由定义为/team_members/:user_id/show。有什么办法可以用 routes.rb 中的resources :team_members 做到这一点?

我尝试过使用:path_names => {:action => "\some\url"},但是对于需要 :id 的操作,路由器会将路由附加为类似于"\:id\some\url"

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 routes


    【解决方案1】:

    编辑: 如果您希望能够编辑团队成员资格,您可以拥有

    resources :users do
        resources :team_members
    end
    

    然后,编辑成员资格 => /users/:user_id/team_members/:id/edit

    然后你可以在 team_members_controller 中做任何你想做的事情。

    或者如 numbers1311407 所说,只需 resources :team_members,您将拥有与团队成员合作的所有其他途径。


    真的不想要标准的/teams/:team_id/users/:id 吗?

    如果你真的想要/team_members/:user_id/show 你可以这样做

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

    但我认为这不是一个好主意。

    【讨论】:

    • "users#show" 和 "users#edit" 实际上与我真正想要的路线和视图不同。我希望能够根据团队上下文编辑和显示团队中的用户,并能够更改他们作为该团队成员的权限状态。由于权限被定义为team_member 模型的一部分,我希望基本上能够以current_team 的管理员身份更改该字符串;除了将路由单独设置为命名空间的一部分之外,我真的没有找到这样做的方法。
    • 这强化了 team_member(成员资格)可能应该被视为其自己的独特资源并由 id 引用的论点,这消除了所有路由复杂性。它还允许您在用户和团队下单独嵌套成员资源。 /memberships/:id, /users/:user_id/memberships/:id, /teams/:team_id/memberships/:id
    • 默认是吧?如果他设置了一个连接模型,它会自动有一个 id。编辑:对不起,没有看到他对你的帖子的评论:)
    【解决方案2】:

    我想知道您正在寻找的是否是:

    resource :team_members do
      resources :users
    end
    

    “resource”命令会创建一个团队不使用 :id 的路由,并允许您使用 current_team 会话变量查找团队。

    您会在您的应用中获得这些路径:

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

    在每种情况下,您都有责任查找 current_team。

    【讨论】:

      【解决方案3】:

      如果关系是多对多,那么您要编写的路线不会引用团队,除非此显示页面旨在显示用户所属的所有团队?

      如果您为连接模型分配一个 ID 并简单地使用它的自然 GET 路由,这将开箱即用,例如/team_memberships/:id

      编辑:抱歉,我没有仔细阅读第二段,如果您将团队存储在会话中,您可以(按照其他人的建议)将 team_members 设置为单例资源,并在获取时将团队从会话中拉出成员。

      但是,如果它在应用程序中工作,则将 team_membership 视为自己的资源可能更自然地 RESTful。

      【讨论】:

      • 我显然已经在迁移中设置了id => false,就像我之前想要的那样。
      猜你喜欢
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      相关资源
      最近更新 更多