这节主要实现用户的微博功能,用户能够发微博,能够删除自己的微博。
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表单。
这样便实现了发布微博的功能。