2017-06-15 210 views
0

我建立一個應用程序與TodoList模型,模型相比可以是私有的(一個User許多TodoList S),或像一個公共組項目(許多User s到許多TodoList小號)。Rails的公共/私有訪問

我目前有一個布爾類型的列is_shared,它確定TodoList是私人的還是公共的。但是,當我嘗試處理這兩種類型的用戶訪問權限時,我的控制器變得臃腫。

有兩個獨立的模型PrivateTodoListPublicTodoList會更好嗎,所以我可以使用單獨的控制器處理每種類型?

編輯:這是我的TodoListsController的一個片段:

class TodosListsController < ApplicationController 
    before_action :authenticate_user 
    before_action :set_todolist, only: [:show, :update, :destroy] 
    before_action :authorized?, only: [:show, :update, :destroy] 
    before_action :member?, only: :show 
    before_action :admin?, only: :update 

    # resourceful actions... 

    private 

    def set_todolist 
    @todolist = TodoList.find(params[:id]) 
    end 

    def authorized? 
    if [email protected]_shared && @todolist.creator.id != current_user.id 
     json_response('Not authorized to view or edit this Todo List', :unauthorized) 
    end 
    end 

    def member? 
    if @todolist.is_shared 
     unless @todolist.members.find_by_id(current_user.id) || 
      @todolist.admins.find_by_id(current_user.id) 
     json_response('You are not a member of this Todo List', :unauthorized) 
     end 
    end 
    end 

    def admin? 
    if @todolist.is_shared 
     unless @todolist.admins.find_by_id(current_user.id) 
     json_response('You are not an admin of this Todo List', :unauthorized) 
     end 
    end 
    end 
end 
+0

一個問題我有兩個單獨的機型看到的是,如果你有功能撥打私人列表,公共反之亦然。您將在兩張獨立的表中保持記錄時遇到麻煩。 – Pramod

+0

請問您是否在控制器中處理權限的方式? – Bustikiller

回答

0

您可以用單個表的傳承(STI)的模型TodoList以確定PrivateTodoListPublicTodoListtype做到這一點。 TodoList的類型決定了您的模型的私人或公共財產。

創建遷移添加列type處理兩個不同TodoList類型

TodoList繼承的單表-傳承從ActiveRecord::Base

# app/models/todo_list.rb 
class TodoList < ActiveRecord::Base 
end 

遺傳模型(這些由type柱區分在todo_lists表中)繼承自TodoList類。

# app/models/public_todo_list.rb 
class PublicTodoList < TodoList 
end 

# app/models/private_todo_list.rb 
class PrivateTodoList < TodoList 
end 

所以,用這種設置,當你這樣做:

  • PublicTodoList.new,創建TodoList.new(type: PublicTodoList )
  • PrivateTodoList.new,創建TodoList.new(type: PrivateTodoList )

您可以將它們作爲單獨的模型爲您的應用程序的模型到模型屁股事件和業務邏輯。

more info on STI

+0

這是對_how_使用兩個獨立模型的一個很好的解釋,但我正在尋找_why_或_why not_。 – jim