2016-05-09 7 views
2

Ich habe eine Twitter-ähnliche Anwendung, wo users können einander durch eine Connection Modell folgen. In einer Tabelle, die alle Leute auflistet, die der @user folgen, möchte ich einen Link zu Follow Back implementieren. Kann ich das mit einem Link machen oder muss ich das mit Formularen machen und nur die Buttons anzeigen? Wie richte ich die Changesets für diese Formulare ein?Folge zurück Funktionalität

Web/Modelle/user.ex

defmodule MyApp.User do 
    use MyApp.Web, :model 
    use Arc.Ecto.Model 

    schema "users" do 
    field :last_name, :string 

    has_many :follower_connections, MyApp.Connection, foreign_key: :followee_id 
    has_many :followers, through: [:follower_connections, :follower] 
[...] 

Web/Modelle/connection.ex

defmodule MyApp.Connection do 
    use MyApp.Web, :model 

    schema "connections" do 
    belongs_to :follower, MyApp.User 
    belongs_to :followee, MyApp.User 
[...] 

web/Controller/user_controller.ex

[...] 
def show(conn, %{"id" => id}) do 
    user = 
    Repo.get!(User, id) 
    |> Repo.preload([:followers, :follower_connections]) 

    conn 
    |> assign(:user, user) 
    |> render("show.html") 
end 
[...] 

web/templates/user/show.html.eex

[...] 
<table> 
    <tbody> 
<%= for connection <- @user.follower_connections do %> 
    <tr> 
     <td><%= link connection.follower.last_name %></td> 
     <td> 
     <%= link ???????? "Follow Back" %> 
     </td> 
    </tr> 
<% end %> 
    </tbody> 
</table> 
[...] 

Der link ???????? Teil ist mein Problem.

Antwort

1

Sie können mit einer Aktion verknüpfen wie diese Umsetzung folgen zurück:

link "Follow back", to: user_path(@conn, :follow_back, user_id, []) 

Der Header wird so etwas wie dieses:

def follow_back(conn, %{"id" => id}) 

In Ihrem Router:

get "/follow_back/:id", UserController, :follow_back 

Diese Lösung überspringt die Changesets überhaupt. Wenn Sie benutzerdefinierte Validierung der Daten wollen dort über die Verwendung embedded_schema für Formulare ein großer Beitrag ist, die nicht direkt auf die Datenbank beibehalten werden: http://blog.plataformatec.com.br/2016/05/ectos-insert_all-and-schemaless-queries/

Die docs auf HTML-Link sind hier: https://hexdocs.pm/phoenix_html/Phoenix.HTML.Link.html Das Tutorial auf Routing: http://www.phoenixframework.org/docs/routing und Tutorial auf den Controllern: http://www.phoenixframework.org/docs/controllers

+0

Würde nicht ein Formular, das connect # verwendet, nicht ein RESTful Weg sein? – wintermeyer

+0

Es wäre total. Das einzige, was Sie im obigen Code ändern müssen, ist, dass Sie 'method:: post' hinzufügen. Es erzeugt das Formular mit einer Schaltfläche, die Sie benötigen. 'link" Folge zurück ", zu: user_path (@conn,: follow_back, user_id, []), Methode:: post'. (Es erfordert jedoch, dass JS aktiviert ist). – tkowal