2017-02-28 67 views
0

假設我有'成員'和'項目'模型。如何正確設置路線以將角色分配給用戶

會員」和「模式」反映了多對多關聯,並通過project_members鏈接連接表。

任何成員都可以在與她相關的所有項目中扮演不一樣的角色。

我試圖寫一個「add_role」和「remove_role」的方法將角色分配給成員。

由於角色應該分配給每個項目/成員我已經構建了一個控制器'project_members_controller',我可以在那裏編寫這些方法。

雖然我很困惑,但給定了我爲這些方法定義路由的方式,我得到了具有相同路徑的兩條POST路由。因此,這聽起來像我做錯了什麼或不瞭解Rails如何工作。

目前我的路線定義爲:

resources :projects do 
    member do 
    get "collaborators", to: "members/members#index" 
    post "collaborators/:id/set_role", to: "project_members#set_role" 
    post "collaborators/:id/remove_role", to: "project_members#remove_role" 
    end 
end 

翻譯在以下路線:

   Prefix Verb URI Pattern           Controller#Action 
collaborators_project GET /projects/:id/collaborators(.:format)     members/members#index 
         POST /projects/:id/collaborators/:id/set_role(.:format) project_members#set_role 
         POST /projects/:id/collaborators/:id/remove_role(.:format) project_members#remove_role 
      projects GET /projects(.:format)         projects#index 
         POST /projects(.:format)         projects#create 
      new_project GET /projects/new(.:format)        projects#new 
     edit_project GET /projects/:id/edit(.:format)       projects#edit 
       project GET /projects/:id(.:format)        projects#show 
         PATCH /projects/:id(.:format)        projects#update 
         PUT /projects/:id(.:format)        projects#update 
         DELETE /projects/:id(.:format)        projects#destroy 

URI模式就是我的目標,但是這聽起來像良好的做法?

如何使用link_to訪問add_role和remove_role方法(如果它們共享相同的路徑)。我應該只在幫手中加入一個網址嗎?和...

在做這樣的事情時使用POST還是應該使用PATCH是否正確?

我很感謝您的指導。

作爲參考我的「project_members_controller.rb」包含類似:

def set_role 
    @project = params[:project_id] 
    if @project.owner.id == current_member.id 
    @project_member = ProjectMember.where(project_id: @project.id, member_id: params[:id]) 
    @project_member.add_role(:observer) if self.roles.blank? 
    # CODE RENDERING OUTPUT 
    render html: "<h1>HOLA</h1>" 
    else 
    # CODE THROWIGN AN ERROR 
    end 
end 

回答

2

始終使用REST的Rails的路線

你可以改變你的航線以下

更新1:

resources :projects do 
    member do 
    get "collaborators", to: "members/members#index" 
    end 
    resources :collaborators, only: [:create, :destroy] 
end 

更新2:

resources :projects do 
    member do 
    get "collaborators", to: "members/members#index" 
    end 
    resources :collaborators, only: [] do 
    member do 
     post 'set_role', => 'project_members#set_role' 
     post 'remove_role' => "project_members#remove_role" 
    end 
    end 
end 

更新3:

resources :projects do 
    resources :collaborators, only: [] do 
    get '/' => "members/members#index", on: :collection 
    member do 
     post 'set_role' => 'project_members#set_role' 
     post 'remove_role' => "project_members#remove_role" 
    end 
    end 
end 
+0

我明白了,但是在控制器不可用的情況下會發生什麼。在這種情況下,Rolify控制器是隱藏的。在這種情況下,RESTful路由不夠,因爲我在另一個控制器中對嗎? – Andrew

+0

你在哪個控制器? – ashvin

+0

根據我上面的問題,我將這些方法添加到project_members_controller.rb'中,只是因爲沒有'roles_controller.rb',因爲所有角色都由Rolify Gem管理。 我在想,也許我應該創建一個角色控制器,並按照你的建議做RESTFUL。但是,我擔心這會打破寶石。 – Andrew

0

而不必單獨梅索德添加和刪除角色,你可以寫一個通用的方法manage_roles添加/刪除角色。

修改你的路由文件。

resources :projects do 
    member do 
    get "collaborators", to: "members/members#index" 
    post "collaborators/:id/manage_roles", to: "project_members#manage_roles" 
    end 
end 

你可以通過設置了一個param與鏈接在此基礎上可以識別添加或刪除角色的點擊。

<%= link_to "Add Role", <manage_roles path> , {role_action: 'add_role', method: :post} %> 

在你的控制器中添加manage_roles方法

def manage_roles 
    if param[:role_action] == add_role 
    # LOGIC TO ADD ROLE 
    else 
    # LOGIC TO REMOVE ROLE 
    end 
end 
+0

普拉莫德,感謝你回答。我可能用一種方法來做這件事,但是我關於重複路徑的問題仍然存在。在這個示例中,我想對該控制器發出的任何POST請求將與您的示例manage_roles方法共享相同的路徑。 – Andrew

+0

@Andrew,當你爲一個成員創建一個角色時,在這裏使用POST是正確的。 – Pramod

相關問題