收藏功能与点赞功能的实作十分类似,本文以购物车教程实作收藏功能为例。
方法一:
step1
一个用户可以收藏多个商品,一个商品可以被收藏很多次,因此这是多对多的关系。因此需要新增一个model,来当做product与suer的桥梁。$ rails g model collect user_id:integer product_id:integer
,然后执行 rake db:migrate
,然后为collect、user与product这三个model加上关联。
1 |
|
1 |
|
在controller里加上对应的method,
1 |
|
step3
在views中的相应位置加入收藏的显示
1 |
|
方法二
step1
同样,终端执行 rails g model colloect
, 编辑 db/migrate/XXXXXXXX_create_collects.rb
1
2
3
4
5
6
7
8
9 class CreateCollects < ActiveRecord::Migration[5.0]
def change
create_table :collects do |t|
+ t.integer :user_id, :index => true
+ t.integer :product_id, :index => true
t.timestamps
end
end
end
之后执行 rake db:migrate
编辑app/models/collect.rb
,加上关联1
2+ belongs_to :user
+ belongs_to :product
编辑 app/models/product.rb
,加上关联1
2
3
4
5
6
7
8
9
10
11
12 + has_many :collects, :dependent => :destroy
+ had_many :collected_users, through: :collects, source: :user
+ def find_collect(user)
+ self.collects.where( :user_id => user.id).first
+ end
```
编辑 `app/model/user.rb`,加上关联
``` ruby app/models/user.rb
+ has_many :collects, :dependent => :destroy
+ has_many :collected_products, through: :collects, source: :product
step2
编辑路由信息1
2
3
4
5
6+ resource :products do
+ member do
+ post :collect
+ post :uncollect
+ end
+ end
在controller中添加:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16+ def collect
+ @product = Product.find(params[:id])
+ unless @product.find_collect(cuurent_user)
+ Collect.create( :user => current_user, :product => @product)
+ flash[:notice] = "您已成功收藏该商品"
+ end
+ redirect_to :back
+ end
+ def uncollect
+ @product = Product.find(params[:id])
+ collect = @product.find_collect(current_user)
+ collect.destroy
+ flash[:warning] = "您已取消收藏该商品"
+ redirect_to :back
+ end
Step3
最后一歩,就是要在 app/views/products/show.html.erb
中加上收藏的按钮
1 | ……略 |