我已经看到局部变量以及在Rails控制器操作中使用的对象变量。两者的一个例子如下:
# Local variable
class MyController < ApplicationController
def some_action
local_variable = Model.find(<some-condition>).delete
end
end
# Object variable
class MyController < ApplicationController
def some_action
@object_variable = Model.find(<some-condition>).delete
end
end
我想知道它们之间的区别以及它们都适合使用的场景。
答案 0 :(得分:4)
Rails将控制器的实例变量导出到所谓的视图上下文中:
class UserController < ApplicationController
def new
@user = User.new
end
end
# the view gets any @ variables from the controller.
# views/users/new.html.haml
= form_for(@user) do
Rails还提供了另一种称为本地的机制:
class UserController < ApplicationController
def new
render :new, locals: { user: User.new }
end
end
# locals are lexical variables in the view context.
# views/users/new.html.haml
= form_for(user) do
将局部变量导出到视图上下文。
对于您不希望隐式导出到视图的任何内容,请使用词法(局部)变量(some_variable)。当您需要在视图和部分之间传递数据或者不完全属于&#34; public api&#34;的时候,在渲染时使用locals选项。您的控制器。
仅将实例变量(@foo)用于来自控制器的重要导出,并将它们视为公共API的一部分。确保你测试它们:
describe UserController do
describe "#new" do
before { get :new }
it "assigns as new user as @user" do
expect(assigns(:user)).to be_a_new_record
end
end
end
答案 1 :(得分:1)
在您提供的代码中,local_variable
仅可用于控制器中的当前方法。您的@object_variable
可用于该方法,但也可用于该视图(可直接作为@object_variable
访问)
因此,只有在想要在视图中使用变量时,才应保留@object_variable
。