这节主要实现用户的微博功能,用户能够发微博,能够删除自己的微博。
1.微博的数据模型
这部分比较简单,前面很多小练习都做过了,将User模型与之关联,形成一对多的关系即可
另外要加上删除的关联功能,删除用户则用户的所有微博也全部删除。
2.显示微博
这里还是用控制台去生成微博,做的工作主要是编写显示微博的页面、以及分页显示
在用户资料页面show中如下:
- <div class="span8">
- <% if @user.microposts.any? %>
- <h3>Microposts (<%= @user.microposts.count %>)</h3>
- <ol class="microposts">
- <%= render @microposts %>
- </ol>
- <%= will_paginate @microposts %>
- <% end %>
- </div>
至于显示单篇微博的局部视图如下:
- <li>
- <span class="content"><%= micropost.content %></span>
- <span class="timestamp">
- Posted <%= time_ago_in_words(micropost.created_at) %> ago.
- </span>
- </li>
剩下的就是修改控制器:
- def show
- @user = User.find(params[:id])
- @microposts = @user.microposts.paginate(page: params[:page])
- end
3. 微博操作-发微博
对于microposts的处理与前面users和sessions不同,也就是说,Microposts 资源相关的页面不是通过 Microposts 控制器实现的,而是依赖于 Users 和 StaticPages 控制器。
以前我们模拟一个简单的博客,post路由是嵌套在users下面的,实际上可以更简单。
resources :microposts, only: [:create, :destroy]
这样就可以了。
访问限制:
这里必须加入一下限制,无论是create还是destroy都必须先登录。于是在Microposts的控制器前面加上过滤器
发微博:
这部分的主要工作在首页上。
修改首页视图,使其登录和未登录时加载不同HTML,登录时具有发微博功能。
这里只列出新增的部分:
- <% if signed_in? %>
- <div class="row">
- <aside class="span4">
- <section>
- <%= render 'shared/user_info' %>
- </section>
- <section>
- <%= render 'shared/micropost_form' %>
- </section>
- </aside>
- </div>
- <% else %>
用户信息的局部视图如下:
- <a href="<%= user_path(current_user) %>">
- <%= gravatar_for current_user, size: 52 %>
- </a>
- <h1>
- <%= current_user.name %>
- </h1>
- <span>
- <%= link_to "view my profile", current_user %>
- </span>
- <span>
- <%= pluralize(current_user.microposts.count, "micropost") %>
- </span>
发微博功能边框的视图如下:
- <%= form_for(@micropost) do |f| %>
- <%= render 'shared/error_messages', object: f.object %>
- <div class="field">
- <%= f.text_area :content, placeholder: "Compose new micropost..." %>
- </div>
- <%= f.submit "Post", class: "btn btn-large btn-primary" %>
- <% end %>
此时@micropost变量是否生成要看用户是否登录。
在静态页面的action中写入:
- def home
- @micropost = current_user.microposts.build if signed_in?
- end
另外把_error_messages.html.erb里面的@user变成object,使其更具有通用性,凡是用到这个视图的都需要增加一个参数,主要是new和edit表单。
这样便实现了发布微博的功能。