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 这项技术,因此整理之后我会用单独的篇幅来描述。

2019

代码整洁之道——程序员的职业素养

少于 1 分钟读完

很难想象我在读这本书的时候是除夕的晚上,早晨在公司的书架上无疑翻到这本书,读了几个章节就被深深的吸引住了, 吸引我的并不是我很迫切的需要提高自己的职业素养,而是发现作者描述的场景和自己碰到的情况何其的相似,在某些 情况下甚至是直击内心的。在家人都休息的时候,我在深夜一点钟看完了这本书,而且我觉得有必要做一下笔记,...

解决 nginx 错误:413 Request Entity Too Large

1 分钟读完

最近项目上遇到一个问题,某个 http 请求会返回 413 的状态码,一般来讲,这个问题是很好解决的, 网上有非常多的解决方案,但是我依然花了很长的时间找到问题根源,所以我觉得可以把这个过程记录下来。

Back to Top ↑

2018

Back to Top ↑

2017

Back to Top ↑

2016

Back to Top ↑

2015

Back to Top ↑

2014

Back to Top ↑