理解控制器调用和方法,Ruby on Rails 3

时间:2011-05-26 23:36:25

标签: ruby ruby-on-rails-3

控制器呼叫

user = User.authenticate(params[:session][:email],
                         params[:session][:password])

在user.rb中验证方法

class << self
   def authenticate(email, submitted_password)
      user = find_by_email(email)
      user && user.has_password?(submitted_password) ? user : nil
      #return nil if user.nil?
      #return user if user.has_password?(submitted_password)
   end
end

我一直在看一些示例rails代码,我对此有点困惑。我知道它在用户对象上调用authenticate方法然后发送电子邮件和密码值,但是什么是:会话符号?我通过代码查找它,但我似乎无法弄明白。我没有看到名为session或者任何东西的方法。

此外,当用户实际使用该程序时,他们只给出电子邮件和密码的值,而不是会话。不确定它在做什么。

我问这个是因为它看起来像是某种“轨道通用练习”类型的东西。但是我可能错了,并没有提供足够的信息。如果我没有,请告诉我。

最后,Class&lt;&lt; self,那就是定义在该类中创建User对象是否正确?

提前感谢您的帮助! (另外我知道主持人会编辑这个以修复我的代码块,如果你们可以告诉我我做错了什么以及如何修复它,我会很感激!)

2 个答案:

答案 0 :(得分:1)

好吧,那里有大约50个不同的问题,但让我们看看我们如何去。

首先:params方法返回控制器操作收到的参数列表。这些通常(99%)由请求发送,但也可以由中间件设置。这两个参数params[:session][:email]params[:session][:password]都是这样的,因为在页面上你已经定义了一个像这样的text_field(我猜):

 <%= text_field "session", "email" %>

此方法的第一个参数告诉Rails要操作的对象,即@session(或@user_session)对象(与您可能看到的session对象不同在控制器中)。第二个参数为此字段提供了一个特殊的唯一名称。在这种情况下,它是email。因为它是这样定义的,所以它将作为params[:session][:email]传递回控制器而不仅仅是params[:email]。它以这种方式完成,这样您就可以区分不同的字段,这些字段可能会发回类似命名的值。

应该回答session的内容。 :session“东西”本身实际上是一个符号。如果你done some reading about Ruby,你会知道它们是什么。

最后:class << self'特殊酱'实际上是为它所在的类定义一个类级方法。你也可以这样做来定义它:

def self.authenticate(arguments)
  # code goes here
end

有些人更喜欢class << self,因为它允许您将类方法分组到它们的大块中,但其他人更喜欢def self.method的明确陈述(甚至有些人做def SomeClass.method!不要听他们......)。这取决于你在这里选择的路径。

好吧,所以我对50个问题的估计有点偏差(48分),但我认为这可以帮助你理解一些事情。如果您仍然感到困惑,请去看医生或阅读a Rails book

答案 1 :(得分:-1)

关于“class&lt;&lt; self”的讨论,请转到there