Rails 应用开发笔记(九)

如果遇到自己的喜欢的文章,收藏功能必不可少,这次做收藏功能化了我不少时间,一方面是不太熟悉 mongoid document 之间的关联,它与 Active Record 关联有些不同,另外就是不熟悉 Ajax 和 jQuery 的使用,还好花了一个周末的时间总算好是搞定了,不过 Ajax 和 jQuery 的使用我会在下节来详细描述,本篇还是主要介绍收藏功能的实现。

首先是建立关联关系,一个用户会收藏多篇文章,每篇文章又可以被多个用户收藏:

class User
  has_many :articles, dependent: :destroy
  has_many :favorites
end

class Article
  belongs_to :user
  has_many   :favorites
end

class Favotite
  belongs_to :user
  belongs_to :article
end

我们可以对文章进行收藏,也可以取消收藏,因此需要两个控制方法来实现收藏和取消收藏的功能:

#app/controller/favorites_controller.rb
class FavoritesController < ApplicationController
  def create
    @article = Article.find(params[:article_id])
    current_user.favorites.create(article_id: params[:article_id])
    redirect_to :back
  end

  def destroy
    favorite = Favorite.find(params[:id])
    @article = favorite.article
    favorite.destroy
    redirect_to :back
  end

end

redirect_to :back 的意思是返回到前一个页面,所以玩家点击收藏或取消收藏的链接时,不会跳转到新的页面,而是依然回到原页面。

然后添加相应的路由:

resources :favorites, only: [:create, :destroy]

为了让代码清晰,收藏标签的代码使用了一个好单独的 partial:

#app/views/favorites/_favorite_link.html.erb
<% if favorite = current_user.favorites.where(article_id: @article.id).first %>
  <%= link_to favorite_path(favorite), method: :delete do %>
    <span class="glyphicon glyphicon-bookmark"></span>
  <% end %>
<% else %>
  <%= link_to favorites_path(article_id: @article.id), method: :post do %>
    <span class="glyphicon glyphicon-bookmark favorite_color"></span>
  <% end %>
<% end %>

这样一来,一个简单的收藏功能就实现了。但是该功能存在一个致命的缺陷,即每次点击收藏或取消收藏链接的时候,整个页面都会被刷新,这显然是无法接受的,这时就要用到 Ajax 大显身手了,应用中有很多地方都要用到 Ajax 这项技术,因此整理之后我会用单独的篇幅来描述。

comments powered by Disqus