Wil*_*tle 0 ruby ruby-on-rails
我一直在关注教科书并构建一个简单的RoR应用程序.令我困惑的一件事是,似乎模块中的变量以某种方式由控制器访问,包含它而没有任何访问器.这是模块:
module CurrentCart
extend ActiveSupport::Concern
private
def set_cart
@cart = Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
@cart = Cart.create
session[:cart_id] = @cart.id
end
end
Run Code Online (Sandbox Code Playgroud)
和控制器调用它
class LineItemsController < ApplicationController
include CurrentCart
before_action :set_cart, only: [:create]
before_action :set_line_item, only: [:show, :edit, :update, :destroy]
....
def create
@product = Product.find(Params[:prouct_id])
@line_item = @cart.line_items.build(product: product)
...
end
Run Code Online (Sandbox Code Playgroud)
你看到了吗?@cart正在使用它可以访问的变量.我对Ruby和Rails都很陌生,但有人能解释一下这是怎么回事吗?
谢谢
在类中包含模块会扩展该类以包含模块的方法和实例变量(至少已经设置的那些).在这种情况下,@ cart在控制器中可用,因为a)已包含模块,b)有一个调用set_cart方法的before_action (设置@cart).
一旦包含它,您基本上可以将模块的内容视为直接出现在控制器中.这并不完全正确,因为当方法被提取到模块中时,您有机会在类中覆盖它们,但是为了您的情况,它仍然存在.
编辑以供说明:您不需要访问器,因为模块的方法和ivars属于控制器类的同一实例.
| 归档时间: |
|
| 查看次数: |
1274 次 |
| 最近记录: |