Beauty tames complexity >代码的美丽程度也显示你驾驭复杂问题的能力。

更新一个资源

来添加一个 edit 按钮,到 views/issues/show.html.erb

<%= link_to 'edit', edit_issue_path(@issue), class: "btn btn-primary" %>

routes.rb 中添加

get 'issues/:id/edit' => 'issues#edit', :as => 'edit_issue'

issues_controller.rb 中添加

def edit
  @issue = Issue.find(params[:id])
end

最重要的是要有 views/issues/edit.html.erb 把 views/issues/new.html.erb 中的内容原封不动搬过来,页面中提交一下,这次的报错是

No route matches [PATCH] "/issues/2"

这里可以看出 form_for 是很智能的,如果传递给他的是一个新对象,就行在 issues#new 中,那他就会提交到 POST issues/ 而如果给他的时已经赋值过的对象,那他就会提交到 PATCH issues/,而这个也正好是可以写到 routes.rb 中,这样

patch 'issues/:id' => 'issues#update'

也需要到 issues_controller.rb 中来添加对应的 action

def update
  i = Issue.find(params[:id])
  i.update_attributes(issue_params)
  redirect_to :root
end

那这样看来,issues/new.html.erb 中,和 issues/edit.html.erb 中公用同样的代码就可以了。新建一个 views/issues/_form.html.erb 文件

<div class="new-issue-form-container clearfix">
  <div class="new-issue-form clearfix">
    <%= form_for issue do |f| %>
      <dl class="form">
        <dt><%= f.label :title %></dt>
        <dd><%= f.text_field :title %></dd>
      </dl>
      <dl class="form">
        <dt><%= f.label :content %></dt>
        <dd><%= f.text_area :content %></dd>
      </dl>
      <p><%= f.submit :class => "submit-issue-button btn btn-primary" %></p>
    <% end %>
  </div>
</div>

然后,把 views/issues/edit.html.erb 和 views/issues/new.html.erb 的内容都删除,共同改为

<%= render partial: 'form', locals: {issue: @issue} %>

实验一下,没有任何问题,甚至提交按钮上的文字都会自动变化。

resources

好,到这里任务就完成了,依旧是看看代码能否重构一下。

到 routes.rb 中,所有的指向 issues_controller.rb 的语句都可以删除,而用一行代替

resources :issues

这一行到底起什么作用。到终端中

rake routes

一看便知。具体参考文档 http://guides.rubyonrails.org/routing.html

一个小点需要调整,首页的 Issue 都没有时间。

_issue_list.html.erb 中添加

<%= time_ago_in_words(i.created_at) %> ago

最好是最新的 issue 在上面。到 weclome_controller.rb 中稍作调整就好了。

def welcome
- @issues  = Issue.all
+ @issues  = Issue.all.reverse
end

RubyGems

现在我想要用 http://fontawesome.io/ 那我可以直接下载它的代码来直接实用。但是更好的办法是添加 font-awesome 这个 gem 。很多第三方的代码,你可以放到你自己的项目代码中,但是如果恰好有人把代码打包成了 gem 那最好是来装包。人家的代码和你的分开,升级维护起来都方便的多。

到 Gemfile 中添加

gem 'font-awesome-rails'

不要忘了运行 bundle 命令和重启服务器。来使用一下,到 application.css 中添加

*= require font-awesome

_issue_list.html.erb 中添加

<i class="fa fa-comments icon-muted"></i>

到 welcome.css.scss 添加

.icon-muted {
  font-size: 25px;
  position: relative;
  top: -20px;
  color: #c9c9c9;
}

这样图标就出来了。