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
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? –
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
ansehen Ja, habe ich. Macht Sinn. Danke für Ihre Hilfe! –