0

The specific code below from the book using Rails 4 I believed in rails 5 required strong parameters that may cause error in Rails 5. Please anyone could share me. How to apply permit and require for the following code)

From model user.rb

def remember
    remember_token = User.new_token
    update_attribute(:remember_digest, User.digest(remember_token))
end

error (in rails 5)

NoMethodError in SessionsController#create
undefined method `update_attribute' for #<Class

Here what I did.

def remember
    remember_token = User.new_token
    update_attribute(:remember_digest, User.digest(params:[remember_token]))
end

error:

NoMethodError in SessionsController#create
undefined method `update_attribute' for #<Class:0x007fd23b30a790> Did you mean? _default_attributes

Tobe clear: those method called from sessionshelper.erb

module SessionsHelper

  # Logs in the given user.
  def log_in(user)
    session[:user_id] = user.id
  end

  # Remembers a user in a persistent session.
  def remember(user)
    User.remember
    cookies.permanent.signed[:user_id] = user.id
    cookies.permanent[:remember_token] = user.remember_token
  end


    # Returns the user corresponding to the remember token cookie.
  def current_user
    if (user_id = session[:user_id])
      @current_user ||= User.find_by(id: user_id)
    elsif (user_id = cookies.signed[:user_id])
      user = User.find_by(id: user_id)
      if user && user.authenticated?(cookies[:remember_token])
        log_in user
        @current_user = user
      end
    end
  end


  # Returns true if the user is logged in, false otherwise.
  def logged_in?
    !current_user.nil?
  end

# Forgets a persistent session.
  def forget(user)
    user.forget
    cookies.delete(:user_id)
    cookies.delete(:remember_token)
  end
  # Logs out the current user.
  def log_out
    forget(current_user)
    session.delete(:user_id)
    @current_user = nil
  end
end

user.rb

class User < ApplicationRecord
  attr_accessor :remember_token, :activation_token, :reset_token, :remember_digest
  before_save { self.email = email.downcase }
  validates :name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
  has_secure_password   
  validates :password, presence: true, length: { minimum: 6 }
class << self
  # Returns the hash digest of the given string.
  def digest(string)
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                  BCrypt::Engine.cost
    BCrypt::Password.create(string, cost: cost)
  end

  def remember
    remember_token = User.new_token
    update_attribute(:remember_digest, User.digest(remember_token))
  end



  # Returns a random token.
  def new_token
    SecureRandom.urlsafe_base64
  end
end
  # Returns true if the given token matches the digest.
  def authenticated?(remember_token)
    BCrypt::Password.new(remember_digest).is_password?(remember_token)
  end
  # Forgets a user.
  def forget
    update_attribute(:remember_digest, nil)
  end

  def activate
    update_attribute(:activated,    true)
    update_attribute(:activated_at, Time.zone.now)
  end

end

sessionscontroller.rb

class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      log_in user
      remember user
      redirect_to user
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new'
    end
  end

  def destroy
    log_out
    redirect_to url_for(:controller => :sessions, :action => :new)  
  end
end

Eooro

PKul
  • 1,691
  • 2
  • 21
  • 41

6 Answers6

0

i have a similar implementation,maybe this might help you

in user.rb

  def create_confimation_token
    generate_token(:confirmation_token)
    update_attribute(:expiration,Time.zone.now + 2.days)
    save!  
  end

  def generate_token(column)
      begin
        self[column] = SecureRandom.urlsafe_base64
      end 
  end   
Milind
  • 4,535
  • 2
  • 26
  • 58
  • I tried then error: NoMethodError in SessionsController#create undefined method `update_attribute' for # Did you mean? _default_attributes – PKul Jan 20 '17 at 05:11
  • this is how i have implemented to save token in user.rb..@T.Kul – Milind Jan 20 '17 at 06:59
  • Thanks but let me work on the same solution then yours is another. Will update later – PKul Jan 20 '17 at 07:15
0

The issue is in the helper, the line

You are calling the remember method with the User class, so it is showing undefined method for class. Instead call with user object

User.remember

should be,

user.remember

def remember(user)
    user.remember
    cookies.permanent.signed[:user_id] = user.id
    cookies.permanent[:remember_token] = user.remember_token
end
Sravan
  • 18,467
  • 3
  • 30
  • 54
0

You should be calling update_attribute on the user try

current_user.update_attribute(a: b)

in your SessionsController#create

Zzz
  • 1,703
  • 1
  • 14
  • 21
  • Hi Zhong I don't understand. currently it called from sessionshelp now you want to change by call fro user ? – PKul Jan 20 '17 at 05:50
  • It already called from SessionsController by 'remember user' is it? – PKul Jan 20 '17 at 06:04
0

update_attributes is an instance method not a class method, so first thing you need to call it on an instance of User class.

like:

 @user.update_attributes(:remember_digest, User.digest(params:[remember_token]))

Try this once.

Jyoti mishra
  • 597
  • 4
  • 16
0

u should call update_attributes for a user object.

helper.rb

  def remember(user)
    user.remember
    cookies.permanent.signed[:user_id] = user.id
    cookies.permanent[:remember_token] = user.remember_token
  end

model.rb

  def remember
    remember_token = new_token
    self.update_attributes(:remember_digest, digest(remember_token))
  end
jithya
  • 428
  • 4
  • 13
  • NoMethodError in SessionsController#create undefined method `remember' for # Did you mean? remember_token As shown on printscreen attached the Question Thanks – PKul Jan 20 '17 at 17:49
0

It worked Now

What happened are the

  1. class << self in user.rb

cause following method not working.

def remember
  remember_token = User.new_token
  update_attribute(:remember_digest, User.digest(remember_token))
end
  1. User.remember in SessionsHelper should be

    user.remember

Thanks everyone

PKul
  • 1,691
  • 2
  • 21
  • 41