【问题标题】:What does self do in ruby on rails?self 在 ruby​​ on rails 中做了什么?
【发布时间】:2011-09-22 19:37:44
【问题描述】:

我正在参加轨道广播,只是在练习一些轨道,并且遇到了一些我想要理解的东西。

我没有得到身份验证方法上的“自我”在做什么。所以我删除了它并测试了我的应用程序的登录,看看它是否会显示错误并且确实如此:

error:

**NoMethodError in SessionsController#create
undefined method `authenticate' for #<Class:0x00000102cb9000**>

如果有人能准确解释“自我”在做什么,我将不胜感激。我试图弄清楚到底发生了什么,但无法理解。

方法在模型中定义并在会话控制器中调用。 我一直在不断地删除我的应用程序并从头开始以掌握它的窍门,每次我重新开始时,很多事情对我来说都是有意义的,但我被困在“自我”上。

我只是那种喜欢理解为什么会起作用的人。

控制器:

 def create
    user = User.authenticate(params[:email], params[:password])
    if user
      session[:user_id] = user.id
      redirect_to root_path, :notice => "Logged In"
    else
      flash.now.alert = "Invalid credentials"
      render "new"
    end
  end

型号:

 def self.authenticate(email, password)
      user = find_by_email(email)
    if user && user.password_hash ==  BCrypt::Engine.hash_secret(password, user.password_salt)
      user
    else
      nil
    end
  end

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 rubygems ruby-on-rails-3.1


    【解决方案1】:

    这是一个基本的红宝石问题。在本例中,self 用于定义类方法。

        class MyClass
          def instance_method
            puts "instance method"
          end
    
          def self.class_method
            puts "class method"
          end
        end
    

    这样使用:

        instance = MyClass.new
        instance.instance_method
    

    或者:

        MyClass.class_method
    

    希望能把事情弄清楚一点。另请参考:http://railstips.org/blog/archives/2009/05/11/class-and-instance-methods-in-ruby/

    【讨论】:

    • 对您的回答稍作扩展:def object.my_foo_method。在obj 上定义my_foo_method。在您的回答中,selfClass 类的对象(即MyClass 类)。因此,它定义了该类的方法。
    • 不应将@ 符号用于实例,例如@instance = ... ?
    • 鉴于它是 rails 并且可能会在视图中使用
    【解决方案2】:

    self 定义了 class 的方法,而不是 class 的 instance。因此,使用def self.authenticate,您可以执行以下操作:

    u = User.authenticate('email@domain.com','p@ss')
    

    而不是做……

    u = User.new
    u.authenticate('email@domain.com','p@ss')
    

    这样,您不必创建用户实例来进行身份验证。

    【讨论】:

    • 除了避免为了使用方法而需要实例化一个类之外,还有其他理由定义类方法而不是实例方法吗?
    【解决方案3】:

    为了完整起见并避免将来的麻烦,我还想指出两者是等价的:

    class User
      def self.authenticate
      end
    end
    
    class User
      def User.authenticate
      end
    end
    

    优先事项。

    【讨论】:

      【解决方案4】:
      class User
          def self.xxx 
          end
      end
      

      是定义类方法的一种方式,而

      class User    
          def xxx 
          end
      end
      

      将定义一个实例方法。

      如果你删除自我。从def中,你会得到一个方法未找到的错误

      User.authenticate
      

      因为您试图调用类的方法而不是类的实例。要使用实例方法,您需要一个类的实例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-06
        • 2010-10-12
        • 2016-10-30
        相关资源
        最近更新 更多