【问题标题】:Why Use a local variable instead of an instance variable inside Session_Controller为什么在 Session_Controller 中使用局部变量而不是实例变量
【发布时间】:2013-08-14 20:47:39
【问题描述】:

Ruby(和 Rails 框架)是我自 1987 年获得 CS 学位以来学习的第一门新编程语言;所以,请耐心等待这个问题。

我一直在学习 Michael Hartl 真正出色的教程,即通过示例学习 Rails。在相对安然无恙地读完前 8 章之后,我在第 9 章遇到了心理障碍。我理解了实例变量和局部变量(在 Ruby 中,更具体地说是在 Rails 中)之间的基本区别。但是,我不明白为什么 Michael 在他的会话控制器中使用局部变量“user”而不是实例变量“@user”。例如,参见 http://railstutorial.org/chapters/sign-in-sign-out#top 的清单 9.9 中的 Create 方法。

Michael 依靠 Sessions_helper 模块进行以下赋值:“@current_user = user”,但如果他首先使用了实例变量,他是否需要进行赋值(假设实例变量在控制器、视图和助手中可用)?他是否使用了局部变量,以便在辅助模块中重新定义“current_user”方法,

定义当前用户

@current_user ||= user_from_remember_token

结束

你们可能很清楚我在这里有点挣扎。无论如何,提前感谢任何可以指导我的人。

-查克

【问题讨论】:

    标签: ruby-on-rails-3


    【解决方案1】:

    首先,您不想为会话用户设置@user 的实例变量,因为它可能与users_controller 中的实例变量名称发生冲突。这就是为什么验证码选择@current_user

    使用帮助器作为使控制器和视图都可以使用这些方法的一种方式,一开始有点令人困惑。你是对的,他这样做是为了让助手设置(或检索,如果已经设置)@current_user。根据 Rails 的座右铭“瘦控制器,胖模型”,作者不想在控制器中定义任何身份验证逻辑或身份验证助手,因此他选择使用助手来处理它。此外,如果您在 create 方法中设置了@current_user,它几乎没有用,因为您的应用程序的其余部分将无法使用@current_user。使用SessionHelper 并将其包含在ApplicationController 中允许应用程序的其余部分在其控制器和视图中使用这些方法。简而言之,在控制器的create方法中不需要将user设为实例变量,因为SessionHelper设置了实例变量,它可以在所有控制器中使用(因为它包含在ApplicationController中),以及所有视图(因为它在 app/helpers 中)。


    我选择了不同的解决方案:
    ApplicationController 中定义一个before_filter(因此它会在每个请求上执行)方法,并包含来自助手的代码:

    @current_user ||= user_from_remember_token
    

    然后在视图中而不是使用<% if signed_in? %>,我使用<% if @current_user %>

    使用 before_filter 在每个控制器的每个请求上执行此代码,而教程方法仅在代码的任何其他部分调用 current_user 时调用会话代码,您可能更喜欢。

    我的方法消除了将这些东西放在app/helpers/ 中的需要,在我看来,这应该只用于帮助意见。但是,嘿,每个人都有自己的......我只是觉得这种方法更容易理解。该教程非常好,并且在 MVC 和 DRYness 方面做得很好,您没有理由不能使用教程中描述的方法。


    您可能已经知道其中的大部分内容,但我认为您可以从中学到的最重要的事情是控制器中应该有很少的业务逻辑(除了路由逻辑)。控制器中的代码应设置实例变量(或在此特定示例中调用方法来设置会话)并路由到适当的视图。您可以使用模型(或其他模块)来完成所有繁琐的工作,以创建应该在这些实例变量中的内容。控制器和 ApplicationController 让您可以访问 http 参数和会话,您可以将参数传递给胖模型(因为模型不知道参数),然后您的模型应该完成大部分工作。

    【讨论】:

    • 非常感谢您的洞察力。我将不得不让这一切沉入一夜。
    • 再次感谢。在你的帮助下,它正在走到一起。
    猜你喜欢
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多