rails模块实例变量是否可用于其他类?

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都很陌生,但有人能解释一下这是怎么回事吗?

谢谢

Joh*_*ohn 5

在类中包含模块会扩展该类以包含模块的方法和实例变量(至少已经设置的那些).在这种情况下,@ cart在控制器中可用,因为a)已包含模块,b)有一个调用set_cart方法的before_action (设置@cart).

一旦包含它,您基本上可以将模块的内容视为直接出现在控制器中.这并不完全正确,因为当方法被提取到模块中时,您有机会在类中覆盖它们,但是为了您的情况,它仍然存在.

编辑以供说明:您不需要访问器,因为模块的方法和ivars属于控制器类的同一实例.