重构 - 第11章,练习3 Rails教程第2版

时间:2012-04-20 22:28:43

标签: ruby-on-rails-3 refactoring railstutorial.org

其他通过Chapter 11 Exercises for Michael Hartl's Rails Tutorial 2nd Edition工作的人吗?

第11章,练习3问: 通过为以下/关注者页面,主页和用户显示页面共同的代码添加部分来重构清单11.31。

我在主页,用户显示页面或show_follow页面中看不到任何值得重构的内容

如果有人想出一些值得参加这项运动的事情,我很乐意知道。

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以重构清单11.31中的第一个代码块:

<section>
  <%= gravatar_for @user %>
  <h1><%= @user.name %></h1>
  <span><%= link_to "view my profile", @user %></span>
  <span><b>Microposts:</b> <%= @user.microposts.count %></span>
</section>

因为它与在主页上使用的views \ shared_user_info.html.erb部分基本相同(代码清单10.32)。因此,您可以使用以下代码替换上面的代码块:

<%= render 'shared/user_info' %> 

请注意,您还需要将<% @user ||= current_user %>添加到views \ shared_user_info.html.erb partial的顶部(这与添加到清单11.20中的stats partial所需的内容相同)。

此外,feed_item + feed部分与用户+ micropost部分之间存在一些重复(尽管不是完全重复),其中取决于正在显示的页面(follow_show,home或profile),有一个或多个元素被列出(名称,重力,管理删除链接,微博内容,微博时间戳和微博删除链接)。这些也可能被重构,以消除feed_item + feed部分,并根据页面将用户+微博部分组合替换它们。

答案 1 :(得分:0)

我刚刚完成了这个练习,找到了一个有效的解决方案。

首先我更改app / views / shared / _user_info.html.erb以使用@user变量(如果已设置)和current_user变量。

应用程序/视图/共享/ _user_info.html.erb:

<% if @user %>
    <%= link_to gravatar_for(@user, size: 52), @user %>
    <h1>
        <%= @user.name %>
    </h1>
    <span>
        <%= link_to "view my profile", @user %>
    </span>
    <span>
        <%= pluralize(@user.microposts.count, "micropost") %>
    </span>
<% else %>
    <%= link_to gravatar_for(current_user, size: 52), current_user %>
    <h1>
        <%= current_user.name %>
    </h1>
    <span>
        <%= link_to "view my profile", current_user %>
    </span>
    <span>
        <%= pluralize(current_user.microposts.count, "micropost") %>
    </span>
<% end %>

然后我将app / views / users / show_follow.hmtl.erb中的相应信息替换为部分_user_info.html.erb

应用程序/视图/用户/ show_follow.hmtl.erb:

<div class="row">
    <aside class="span4">
        <section>
            <%= render 'shared/user_info' %>
        </section>
        <section>
            <%= render 'shared/stats' %>
            <% if @users.any? %>
                <div class="user_avatars">
                    <% @users.each do |user| %>
                        <%= link_to gravatar_for(user, size: 30), user %>
                    <% end %>
                </div>
            <% end %>
        </section>
    </aside>
    <div class="span8">
        <h3><%= @title %></h3>
        <% if @users.any? %>
            <ul class="users">
                <%= render @users %>
            </ul>
            <%= will_paginate %>
        <% end %>
    </div>
</div>

我希望这个答案可以帮助任何人通过M. Hartl的教程。