随机功能的实现

Published on:

随机功能

这个功能其他人可能不需要吧,你去商店肯定知道自己要买什么,随机加入几件商品到购物车,这个人八成是疯子,但我们的网站是做顾客随意自选原材料,大厨上门实做的网站,有些顾客可能会觉得太麻烦了,还有一些顾客对调料什么的根本没概念,所以呢就想要写一个随机的功能,只有一个按钮,顾客点一下,就有几件商品随机扔到购物车了,不需要动脑,而且没人知道会出现什么样的搭配,更没人知道最后的菜品是如何的了,想想就很开心呀,哈哈。

参考了吉米的作品,随机推荐五个工作,在mvc里分别是这么写的:

controller

index

@suggests = Job.published.random5

model

scope :random5, -> { limit(5).order("RANDOM()") }

html

<% @suggests.each do |job| %>
 <%= link_to job_path(job), target: "_blank" do %>
 <%= job.name %> 
<% end %>

很明显,这个功能的核心在于model里面的那一句。

但他的代码只能是把job显示出来,不能放到购物车里,想放到购物车里肯定是需要routes和controller的配合。

routes应该这么写

collection do
  post :lucky_cart
end

因为不是单一行为,所以不是member,而是collection。

model暂时不变

那controller里面到底应该如何写呢?可能会用到循环吧,但到底应该如何写呢?不知道呀,去问了daniel学长。

daniel学长平时挺喜欢和我开玩笑的,一瞬间就写出来了

diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb
index bc61959..8618674 100644
--- a/app/controllers/products_controller.rb
+++ b/app/controllers/products_controller.rb
@@ -13,4 +13,12 @@ class ProductsController < ApplicationController

     redirect_to :back
   end
+
+  def lucky_cart
+    @products = Product.random5
+    @products.each do |product|
+      current_cart.add_product_to_cart(product)
+    end
+    redirect_to carts_path, notice:"霖霖赞你好手气~"
+  end
 end
diff --git a/app/models/product.rb b/app/models/product.rb
index 41b5b40..19748fc 100644
--- a/app/models/product.rb
+++ b/app/models/product.rb
@@ -17,6 +17,7 @@ class Product < ApplicationRecord

   mount_uploader :image, ImageUploader
   before_create :generate_token
+  scope :random5, ->{ order("RANDOM()").limit(5) }

   def to_param
     self.random_token
diff --git a/app/views/common/_navbar.html.erb b/app/views/common/_navbar.html.erb
index d00dc10..392d5a2 100644
--- a/app/views/common/_navbar.html.erb
+++ b/app/views/common/_navbar.html.erb
@@ -19,6 +19,7 @@
                 <%= link_to carts_path do  %>
                 购物车 <i class="fa fa-shopping-cart"> </i> ( <%= current_cart.products.count %> )
                 <% end %>
+                <li><%= link_to("lucky cart", lucky_cart_products_path, method: :post) %></li>
               </li>
                 <% if !current_user %>
                 <li><%= link_to("注册",new_user_registration_path) %></li>
diff --git a/config/routes.rb b/config/routes.rb
index 3807688..5009f6c 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -28,6 +28,9 @@ resources :orders do

   resources :cart_items
   resources :products do
+    collection do
+      post :lucky_cart
+    end
     member do
     post :add_to_cart
     end

为了向他致敬,flash都没有变动,我其实是个男的,我其实是个男的,我其实是个男的。

controller里面是这么写的:

+  def lucky_cart
+    @products = Product.random5
+    @products.each do |product|
+      current_cart.add_product_to_cart(product)
+    end
+    redirect_to carts_path, notice:"霖霖赞你好手气~"
+  end

这可能就是传说中的一出手就能解决问题吧。

而且超有大侠风范:事了拂衣去,深藏身与名。怎么叫他都不回。

views中,由于routes是写到了product下面,所以路径写的也是lucky_cart_products_path。

按钮写到了navbar上,一点就会有五件商品随机加入到购物车中,蛮好玩的。

而且只要改动model中的limit后面的数字,就能变动随机几件了。

然后呢我就开始胡搞了。

首先加了一个页面,叫lucy cart,入口在navbar上。

然后在model中

  scope :random5, ->{ order("RANDOM()").limit(5) }
  scope :random6, ->{ order("RANDOM()").limit(6) }
  scope :random7, ->{ order("RANDOM()").limit(7) }
  scope :random8, ->{ order("RANDOM()").limit(8) }
  scope :random9, ->{ order("RANDOM()").limit(9) }

controller里有五个对应的def,在lucy页面放了五个按钮,在routes设置了五条路径,这样我就搞出了五种随机,五死我了。

这样子看起来会比较无聊,确定性太多了。因为你事先已经知道自己的购物车会有多少种商品了。

能不能搞一个随机随机!点一下之后不知道到底有多少物品进入购物车,哈哈,一定会很有趣。

那应该如何实现呢?

我一下子就想起来seed里的范围随机:rand(6..8)

(seed的教程详情请点 https://forum.qzy.camp/t/seed/1626

那到底能不能用呢?我就试着把model里胡搞成这样了:

  scope :random3, ->{ order("RANDOM()").limit(rand(3..5)) }
  scope :random4, ->{ order("RANDOM()").limit(rand(4..6)) }
  scope :random5, ->{ order("RANDOM()").limit(rand(5..7)) }
  scope :random6, ->{ order("RANDOM()").limit(rand(6..8)) }
  scope :random7, ->{ order("RANDOM()").limit(rand(7..9)) }

居然可以的,哈哈,好开心呀!

最后就变成我们网站的样子喽。

写的不是很详细,因为不是我搞出来的,核心还是daniel学长的TAT,有任何疑问可以去参考我的源码:

https://fullstack.xinshengdaxue.com/works/556

也可以微信联系我, m60_06m 。

我的作品 https://fullstack.xinshengdaxue.com/works/556 (大家都熟的 嘻嘻)已经更新到第11版了,明天会出终版吧,都已经10号了,那今朝别离后,何日君再来呢?

好像有点感伤呢,抱歉。

Comments

comments powered by Disqus