スポンサーリンク

2015年8月14日

[Elixir+Phoenix]Micropost of following users

Goal

フォローしているユーザのマイクロポストを表示する。

Dev-Environment

OS: Windows8.1
Erlang: Eshell V6.4, OTP-Version 17.5
Elixir: v1.0.4
Phoenix Framework: v0.13.1
PostgreSQL: postgres (PostgreSQL) 9.4.4

Wait a minute

現在、フォローしているユーザのマイクロポストを
ユーザのプロファイルに表示させます。
ほとんどやることがないように見えますが、
すんなり終わらせてもらえるでしょうか?

Index

Micropost of following users
|> Get Micropost
|> Extra

Get Micropost

マイクロポストの取得を修正します。
ファイル: web/models/micropost.ex
関数のクエリを以下のように修正。
def paginate(user_id, select_page, following_ids) do
  SampleApp.Helpers.PaginationHelper.paginate(
    from(m in SampleApp.Micropost,
      where: m.user_id in ^following_ids or m.user_id == ^user_id,
        order_by: [desc: m.inserted_at]),
    select_page)
end
ファイル: web/controllers/user_controller.ex
フォローしているidのリストを取得し、マイクロポストを取得する際の引数へ渡している。
def show(conn, %{"id" => id, "select_page" => select_page}) do
  user = Repo.get(SampleApp.User, id) |> Repo.preload(:relationships) |> Repo.preload(:reverse_relationships)
  ids_list = list_map_to_value_list(user.followed_users, :followed_id)

  page = SampleApp.Micropost.paginate(user.id, select_page, ids_list)
  changeset = SampleApp.Micropost.new_changeset(
    %SampleApp.Micropost{}, %{content: "", user_id: user.id})
  ...
end
これで完成~

Extra

少しだけ追加。
今のままですと、他のユーザを参照するには直接URLを叩かなければいけません。
最後にその部分を修正し、Tutorialを終わりたいと思います。
ファイル: web/views/user_view.ex
関数追加。
def add_first_page_param(action) do
  "#{action}?select_page=1"
end
ファイル: web/templates/user/index.html.eex
aタグ部分を追加。
<%= for user <- @users do %>
  <tr>
    ...
    <td>
      <a href="<%= add_first_page_param(user_path(@conn, :show, user)) %>">
        <h4><%= user.name %></h4>
      </a>
    </td>
  </tr>
<% end %>
ファイル: web/templates/user/show_follow.html.eex
aタグ部分を追加。
<div style="clear: left; margin-top: 30px;">
  <%= if @users do %>
    <div class="user_avatars">
      <%= for follow_user <- @users do %>
        <a href="<%= add_first_page_param(user_path(@conn, :show, follow_user)) %>">
          <img src="<%= get_gravatar_url(follow_user) %>" class="gravatar">
        </a>
      <% end %>
    </div>
  <% end %>
</div>
<div style="clear: right; margin-left: 250px;">
  <%= if @users do %>
    <ul>
      <%= for follow_user <- @users do %>
        <li>
          <a href="<%= add_first_page_param(user_path(@conn, :show, follow_user)) %>">
            <img src="<%= get_gravatar_url(follow_user) %>" class="gravatar">
            <h4><%= follow_user.name %></h4>
          </a>
        </li>
      <% end %>
    </ul>

    <%= render "pagination.html",
             action: @action,
             current_page: @current_page,
             page_list: @page_list,
             total_pages: @total_pages %>
  <% end %>
</div>

Speaking to oneself

お疲れ様でした。
拙い内容とソースコードだったと思いますが、
ここまでお付き合い頂いた方には感謝します。
これにて、Tutorialを終わりにしたいと思います。
それにしても、何とか終わりましたね。
終わったと言うより、終わらせた感がありますが(笑)
何にせよ区切りがついたことは変わりありません。
この後、アプリケーションのソースコード全体にかけてリファクタリングをしていく予定です。
詳しいところは、女心と秋の空より移り気な今後の予定を書いた記事を上げますので、
そちらを参照して下さい。
まとめ記事を上げるの忘れないようにしないと。
それでは、また近いうちに~ノシ

Bibliography

人気の投稿