刘华佼的全栈学习记录

5-10 rails中的"member do" and "collection do"

| Comments

config/routes.rb中的member do 和collection do的主要区别是:

如果需要自定义对特定元素的action,需要用到成员路由member do;
如果需要自定义元素集合的action,需要用到集合路由collection do。

特定元素是什么意思呢?

我们先看5-2 Step 1 : 建立加入购物车的 action中有一段:

+  resources :products do
+    member do
+      post :add_to_cart
+    end
+  end

就会生成add_to_cart_product_path(@product)的url helper,产生出如products/1/add_to_cart这样的网址。

做完这一章后,可以打开http://localhost:3001/rails/info/routes
查找add_to_cart_product_path,显示如下:


add_to_cart_product_path(@product)5-2 Step 1 : 建立加入购物车的 action里的app/views/products/show.html.erb有用到过:

+ <%= link_to("加入购物车", add_to_cart_product_path(@product), :method => :post, :class => "btn btn-primary btn-lg btn-danger") %>

特定元素的意思就是:生成的url helper,需要带(@pruduct)参数,@product是特定的单一个product。

元素集合是什么意思呢?

我们先看6-1 购物车练习作业 (解答)中有一段:

 + resources :carts do
 +   collection do
 +     delete :clean
 +   end
 + end

就会生成clean_carts_path的url helper,产生出如/carts/clean这样的网址。

做完这一步后,可以打开http://localhost:3001/rails/info/routes
查找clean_carts_path,显示如下:


clean_carts_path6-1 购物车练习作业 (解答)里,app/views/carts/index.html.erb有用到过:

+  <%= link_to("清空购物车", clean_carts_path ,
+              method: :delete , class: "pull-right",
+              style: "text-decoration: underline;",
+              data: { confirm: "你确定要清空整个购物车吗?"} )%>

元素集合的意思就是:生成的url helper,不需要带(@cart)这样的参数,它是对所有的carts做同一操作,而不是对单一个cart操作。

附注:

“元素”也可以理解为“实例变量”、“对象”,它是@cart、@product、@group、@post、@job等等;
“元素集合”可以理解为“对象集合”或者“资源”,它是carts、products、groups、posts、jobs等等。

意外惊喜

发现了Ruby on Rails 指南 (v5.0.1)网站。

参考资料:

添加更多 REST 式动作
collection do与member do的区别
RESTful路由

Comments

comments powered by Disqus