2014-01-19 51 views
1

符合rails最佳實踐設計模式 - 瘦身控制器,胖模型 - 在哪裏以及如何根據控制器操作設置活動記錄模型的默認值。例如,採取以下行動釋放汽車。如果沒有概述,請提出一個更易維護的方法。開發自定義release_car保存方法是否過度了?Rails - 在哪裏以及如何設置Active Record模型的值 - 控制器或模型?

#### OPTION #1 #### 
    # controller 
    def release 
    # scope available is 'car_status_code = 'A' 
    @car = Car.available.where(id: params.require(:id), 
             client_id: current_user.client_id).last 

    @car.car_updated_at_user_id = current_user.id 

    # are these considered 'business logic' that go into model??? 
    @car.car_release_date = Date.current 
    @car.car_status_code = 'R' 

    # car_release_update_params is about 7 strong params 
    if @car.update_attributes(car_release_update_params) 
     render json: "Car released", status: :ok 
    else 
     render json: @car.errors.full_messages, status: :unprocessable_entity 
    end 
    end 

    #### OPTION #2 #### 
    # controller 
    def release 
    # scope available is 'car_status_code = 'A' 
    @car = Car.available.where(id: params.require(:id), 
             client_id: current_user.client_id).last 

    # car_release_update_params is about 7 param fields 
    if @car.release_car(car_release_update_params) 
     render json: "Car released", status: :ok 
    else 
     render json: @car.errors.full_messages, status: :unprocessable_entity 
    end 

    end 

    #model 
    def release_car(params) 

    if self.car_status_code != 'A' 
     errors.add(:base, 'Car must be in Available status to be released') 
     return false 
    end 

    self.car_status_code = 'A' 
    self.car_release_date = Date.current #timezone friendly 

    #assign values for other fields based on params hash 
    ..... 
    self.save 

    end 
+1

最佳實踐不是*瘦身控制器,胖模特*,而是*繁忙控制器*,其中的某些邏輯可以移動到助手,*瘦身模型*和*胖庫*。所以,將'#release_car'移到控制器的幫助器,並從那裏使用它。並有一個清理模型。 –

回答

0

通常我總是建議把你的邏輯模型。 MVC(模型視圖控制器)是一種從對象(視圖)和其控制單元(控制器)的呈現中分離出數據和邏輯(模型)的原理。

因此,更好的做法是通過調用模型中的方法,然後更改控制器的各種屬性,但這並不意味着所有方法都必須直接在模型中定義。只需在模型中聲明您的「核心」方法,並將其他「周邊」方法放入擴展該類的模塊中。命名這些模塊的語義,所以你不會對在哪裏找到你的代碼感到困惑。您可以使用ActiveSupport::Convern來完成此操作。我在這裏所說的使用:

https://stackoverflow.com/a/8504448/1001324

這有一個很大的上升空間,當涉及到多態關聯。您可以在單個文件中使用一個多態關聯聲明多個模型的方法,並使用此關聯擴展所有類。

相關問題