ada*_*ott 2 ruby ruby-on-rails
在我的应用程序中,我有一个使用实例变量的products_controller.我对Ruby中实例变量的理解是你可以在同一个类的不同方法中使用它们.那么为什么我们在rails应用程序的多种方法中使用相同的实例变量呢?下面我们有一个实例变量@product设置两次,当我们在create动作中使用时,新动作中的@product变量是否被覆盖?
我对同一类方法中这些变量的范围感到有点困惑.
def new
@product = Product.new
end
def create
@product = Product.new(product_params)
respond_to do |format|
if @product.save
format.html { redirect_to @product, notice: 'Product was successfully created.' }
format.json { render :show, status: :created, location: @product }
else
format.html { render :new }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
end
Run Code Online (Sandbox Code Playgroud)
实例变量位于实例类范围中.在Ruby on Rails中,由于API的构建方式,视图中也提供了实例变量.
您需要注意新的和创建方法通常用于不同的ProductsController实例.
第一个请求:GET http:// localhost:3000/product/new
当您请求new操作时(我想这是一个表单),在给定点的Rails API实现创建一个实例ProductsController并将new消息发送到该实例(调用新方法).然后,创建实例变量@product,并在任何方法或操作呈现的任何视图中可用.在给定的点上,Rails回复一个网页,并且类实例及其所有实例变量都被销毁(将不再可用).
第二个请求:POST http:// localhost:3000/product/create
提交数据库持久性表单时,将再次创建一个新的控制器实例,并create调用该方法.因为是一个新实例,所以@product没有任何值.
但请注意,渲染视图(如在new动作中发生的视图)和重定向(如果您在create动作中执行,如果@product.save为真)之间存在差异.渲染时,您将保留在同一控制器实例中,并且在重定向时,会发生新的服务器请求,因此会破坏先前的控制器实例并创建新的控制器实例.
之前的行动
在实际开始执行操作代码之前调用before_action.在Rails透视图中,操作不是Ruby方法.类方法是该操作的定义:
来自Rails指南:
控制器是一个Ruby类,它继承自ApplicationController,并且具有与任何其他类一样的方法.当您的应用程序收到请求时,路由将确定要运行的控制器和操作,然后Rails创建该控制器的实例并运行与该操作同名的方法.
该动作充当由路线确定的入口点.如果在new中调用create,则不会再次触发before_action.