【问题标题】:Rails - Controller Object Scope vs Controller Function ScopeRails - 控制器对象范围与控制器功能范围
【发布时间】:2015-10-12 07:57:36
【问题描述】:

我已经看到在 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

我想知道它们有什么区别以及它们都适合使用的场景。

【问题讨论】:

  • 一个区别是你不能在视图中使用控制器中定义的local_varaibles,但你可以使用object_variables
  • 顺便说一句,你真的不应该使用delete
  • 正确使用.destroy 而不是.deletedelete 不会调用模型上的任何回调,例如级联销毁(删除父级时销毁子记录)或任何清理。

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


【解决方案1】:

在您提供的代码中,local_variable 仅可用于控制器中的当前方法。您的@object_variable 可用于方法,也可用于视图(直接以@object_variable 访问)

因此,您应该保留使用@object_variable,仅当您想在视图中使用变量时使用。

【讨论】:

    【解决方案2】:

    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 还提供了另一种称为 locals 的机制:

    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)。当您需要在视图和部分或不完全属于控制器“公共 api”的内容之间传递数据时,请在渲染时使用 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
    

    【讨论】:

      猜你喜欢
      • 2018-12-12
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多