Что делает self в ruby ​​на рельсах? - PullRequest
6 голосов
/ 22 сентября 2011

Я на железной дороге, просто практикую некоторые рельсы и наткнулся на то, что я пытаюсь понять.

Я не понял, что делал "я" в методе аутентификации. Поэтому я удалил его и проверил логин моего приложения, чтобы увидеть, будет ли оно отображать ошибку, и оно показало:

error:

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

Я был бы очень признателен, если бы кто-то мог точно объяснить, что делает это «Я». Я пытался выяснить, что именно происходит, но не могу понять, как это происходит.

Метод определен в модели и вызван в session_controller. Я постоянно удаляю свое приложение и начинаю с нуля, чтобы освоить его, и многие вещи имеют смысл для меня каждый раз, когда я начинаю снова, но я застрял на «себе».

Я просто тот человек, которому нравится понимать, почему что-то работает.

Контроллер:

 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

Ответы [ 4 ]

13 голосов
/ 22 сентября 2011

Это основной вопрос по рубину.В этом случае 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/

5 голосов
/ 22 сентября 2011

self определяет метод класса вместо экземпляра класса. Таким образом, с def self.authenticate вы можете сделать следующее:

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

Вместо того, чтобы делать ...

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

Таким образом, вам не нужно создавать экземпляр пользователя для его аутентификации.

3 голосов
/ 23 сентября 2011

Ради завершенности и для предотвращения будущих головных болей я хотел бы также отметить, что они эквивалентны:

class User
  def self.authenticate
  end
end

class User
  def User.authenticate
  end
end

Вопрос предпочтения.

2 голосов
/ 22 сентября 2011
class User
    def self.xxx 
    end
end

- это один из способов определения метода класса, в то время как

class User    
    def xxx 
    end
end

определит метод экземпляра.

Если вы удалите self.из определения вы получите ошибку метода not found, когда вы выполните

User.authenticate

, потому что вы пытаетесь вызвать метод класса, а не его экземпляра.Чтобы использовать метод экземпляра, вам нужен экземпляр класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...