2017-04-19 33 views
0

我正嘗試使用連接中的當前用戶分配創建多對多關係。問題是我無法訪問模型中的conn。我試着將它與變更集一起傳遞,但這似乎並不是正確的做法。使用Phoenix Framework在模型中獲得conn?

處理這個問題的最佳方法是什麼?我想我可以將conn導入模型。我有什麼理由不想這樣做?

這裏是我的變更看起來像現在

def changeset(model, user, params \\ :invalid) do 
    model 
    |> cast(params, @required_fields) 
    |> put_assoc(:users, [user]) 
    |> validate_required([:name]) 
    |> unique_constraint(:name) 
end 

UPDATE

結束了與史蒂夫的建議下去。爲用戶標識添加了一個虛擬字段到架構,並將此功能添加到變更管道

def changeset(model, params \\ :invalid) do 
    model 
    |> cast(params, @required_fields) 
    |> associate_current_user(params) 
    |> validate_required([:name]) 
    |> unique_constraint(:name) 
    end 

    def associate_current_user(model, params) do 
    case params do 
     %{"user_id" => id} -> 
     user = Repo.get!(User, id) 

     model 
     |> put_assoc(:users, [user]) 
     _ -> 
     model 
    end 
    end 

回答

1

爲什麼不只是將當前的user_id添加到params中並以這種方式處理它。如果新/更新來自Web表單,則很容易在模板中獲取current_user並添加隱藏輸入。

+2

但是現在每個人都可以改變表單中的id,或者我失去了一些東西? – JustMichael

+0

是的,這是一個很好的觀點。更好的想法是將其添加到控制器中的參數。 –

3

我不會這麼做。起初它可能是誘人的,但後來它會讓你或者其他人維護這個代碼而感到困惑。

模型是應用程序的獨立層,因此在該區域使用conn會將其與控制器非常緊密地耦合。雖然,模型只是一個Elixir模塊,所以在完美的世界中,您可以在沒有Phoenix和請求/響應週期的情況下使用它們。

還要考慮對該函數進行單元測試 - 你能否確定conn總是看起來像你需要和需要的東西?

不要混淆顧慮。爲了編排conn流程,你有了控制器,並且從Phoenix 1.3管理模式,你有了有限的上下文。

+0

有關如何獲取當前用戶關聯的任何建議?不確定最好的方式去爲一個many_to_many關聯。 – humdinger

相關問題