2016-03-29 8 views
5

Ich ziehe von Rails nach Phoenix und stürze mich in ein Problem, für das ich keine Antwort finden kann.Aktuelle Benutzerinformationen zu einem Post in Phoenix Framework hinzufügen

Ich habe die Benutzerauthentifizierung eingerichtet (indem ich in einer privaten Authentifizierungsfunktion nach @current_user sucht).

Ich habe auch eine Post-Modell/Controller/Ansicht (Gerüst für die bekannten w Schienen).

Ich mag würde, um automatisch einen Beitrag Feld mit dem @current_user ID füllen, wenn das Formular abgeschickt wird (jeder Beitrag wird zu einem Benutzer gehören) ohne ein Formularfeld, dass der Benutzer zu füllen hat.

In Rails dies ist ziemlich einfach ... so etwas wie dieses zu dem erstellen Aktion der Post-Controller funktioniert:

@post.user = current_user.id 

Wie kann ich tun dies mit dem Phoenix-Framework/Elixir?

Hier ist das Erstellen Aktion in meinem Postcontroller

def create(conn, %{"post" => post_params}) do 
    changeset = Post.changeset(%Post{}, post_params) 

    case Repo.insert(changeset) do 
     {:ok, _project} -> 
     conn 
     |> put_flash(:info, "Please check your email inbox.") 
     |> redirect(to: page_path(conn, :thanks)) 
     {:error, changeset} -> 
     render(conn, "new.html", changeset: changeset) 
    end 
    end 

Sollte diese Art von Logik in der Steuerung oder das Modell durchgeführt werden? oder gibt es eine gute Möglichkeit, dies in der Ansicht zu tun (ohne ein verstecktes Feld zu verwenden, das nicht sicher ist).

Lösung (dank Gazler):

def create(conn, %{"post" => post_params}) do 
    current_user = conn.assigns.current_user 
    changeset = Post.changeset(%Post{user_id = current_user.id}, post_params) 
    case Repo.insert(changeset) do 
     {:ok, _project} -> 
     conn 
     |> put_flash(:info, "Please check your email inbox.") 
     |> redirect(to: page_path(conn, :thanks)) 
     {:error, changeset} -> 
     render(conn, "new.html", changeset: changeset) 
    end 
    end 

Antwort

10

können Sie verwenden, um die folgenden:

current_user = conn.assigns.current_user 
changeset = Post.changeset(%Post{user_id: current_user.id}, post_params) 

Oder verwenden Ecto.build_assoc/3:

current_user = conn.assigns.current_user 
changeset = Ecto.build_assoc(current_user, :posts, post_params) 

Diese Sie current_user haben davon ausgegangen, in Ihre conn.assigns.

+0

Danke Gazer. Ich habe meine Frage bearbeitet - ich habe eine private Funktion, die nach conn.assigns.current_user sucht (und funktioniert); Ich bekomme jedoch einen Fehler undefinierte Funktion current_user. Wie stelle ich sicher, dass current_user in meinen Conn.assigns ist? –

+0

Es sieht so aus, als hätten Sie den 'current_user = conn.assigns.current_user' vergessen (den ich nur im ersten Beispiel gezeigt habe. Ich habe den 2. aktualisiert, um ihn auch aufzunehmen). Wenn Sie nicht 'conn.assigns.current_user' aufrufen wollen, können Sie sich den Abschnitt' overriding: action' von https://hexdocs.pm/phoenix/Phoenix.Controller.html – Gazler

+0

ansehen Ja, habe ich. Macht Sinn. Danke für Ihre Hilfe! –

Verwandte Themen