全栈工程师成长记

编程重新定义人生

关于MVC数据流的一些记录

做网站永远要记得的就是数据流的概念,通俗的说就是一个数据从某个地方流到另一个地方。

Controller 的 Action 要捞取什么数据,取决于你想在 View 里面显示什么数据。比如想要在 admin 的后台显示所有用户的订单记录,则 admin/orders_controller 的 index 定义为 @orders = Order.all 。如果想要让在每个用户的个人订单列表显示个人的所有历史记录,则 account/orders_controller 的 index 定义为 @orders = current_user.orders 。

以 admin 后台为例:order index 的数据流向就是先在浏览器请求显示后台订单首页,Routes 向 Controller 发出请求,Controller 根据 index action 的定义向 Model 请求捞取所有订单,Model 从 Database 捞取数据并返回到 Controller ,Controller 将数据发送给 Views ,Views 从 @orders 变量 each 出每一条数据并生成页面,最后给浏览器输出结果。

再记录两个案例,在做jdstore的订单取消功能时,关于路径和数据流的错误:

第一
在 routes 里面定义路径少了 member do ,导致网址传送错误,出来的结果是:
"order_id"=>"bf877deb-7d75-47c2-ad92-2bfdd2a316b6"
正确的写法应该是:
namespace :admin do
resources :orders do
member do
post :cancell_order
end
end
end
出来的正确结果是:
"id"=>"bf877deb-7d75-47c2-ad92-2bfdd2a316b6"

第二
在 Controller 里面捞取 order 用的是 find_by_token(params[:id]),但在 View 里面传送网址却写成 cancell_order_admin_order_path(order),这导致无法传送正确的参数,应该做到前后一致
,也就是在 Controller 里面捞取 order 用的是find_by_token(params[:id]),在 View 里面传送网址就要用(order.token)
如果用的是find(params[:id]),在view里面传送网址就要用(order)

上述两个错误导致数据的流向出现断层,在 admin 后台点击 Cancel Order 的按钮时,会提示 @order.cancell_order!这行代码里不存在 cancell_order 这个 method。

补充记录一点:cancell_order后面的感叹号表示保存的意思,这样就不用先 @order.cancell_order 再 @order.save 了。