2016-05-09 110 views
2

我有一個類似Twitter的應用程序,其中users可以通過Connection模型跟隨對方。在列出所有跟隨@user的人列表中,我想要實施鏈接Follow Back。我可以通過鏈接來做到這一點,還是必須使用表單來做到這一點,並只顯示按鈕?我如何設置這些表單的變更集?後退功能

幅/模型/ 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] 
[...] 

幅/模型/ connection.ex

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

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

網/控制器/ 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 
[...] 

網頁/模板/用戶/ 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> 
[...] 

link ????????部分是我的問題。

回答

1

您可以鏈接到一個動作執行後續回這樣的:

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

標題將是這樣的:

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

在你的路由器:

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

這解決方案完全跳過了變更集。如果你想上的數據自定義驗證存在使用embedded_schema對於不直接保存到數據庫表格的好職位:http://blog.plataformatec.com.br/2016/05/ectos-insert_all-and-schemaless-queries/

上的HTML鏈接的文檔是在這裏:https://hexdocs.pm/phoenix_html/Phoenix.HTML.Link.html 路由上的教程:http://www.phoenixframework.org/docs/routing 並在教程上的控制器:http://www.phoenixframework.org/docs/controllers

+0

不會使用連接#創建不是一個更RESTful方式? – wintermeyer

+0

它完全會。在上面的代碼中需要改變的唯一方法是添加'method::post'。它會用你需要的按鈕生成表單。 'link「Follow back」,到:user_path(@conn,:follow_back,user_id,[]),方法:: post'。 (它需要JS被啓用)。 – tkowal