Rails - 控制器对象范围与控制器功能范围

时间:2015-07-22 12:28:50

标签: ruby-on-rails ruby oop variables model-view-controller

我已经看到局部变量以及在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

我想知道它们之间的区别以及它们都适合使用的场景。

2 个答案:

答案 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