Michael Hartl Rails 教程第 11 和 12 章:多个错误和邮件未发送
Posted
技术标签:
【中文标题】Michael Hartl Rails 教程第 11 和 12 章:多个错误和邮件未发送【英文标题】:Michael Hartl's Rails tutorial chapter 11 & 12: multiple erros and mails not being send 【发布时间】:2017-04-29 20:16:07 【问题描述】:我目前正在使用 rails 教程的第 12 步,在发送帐户激活电子邮件和访问某些页面时遇到问题(我收到错误)
请求密码重置时出现以下错误
NameError in PasswordResetsController#create
uninitialized constant User::FILL_IN
Extracted source (around line #62):
def create_reset_digest
self.reset_token = User.new_token
(the code below is highlighted red)
update_columns(reset_digest: FILL_IN, reset_sent_at: FILL_IN)
end
# Sends password reset email.
来源是:
app/models/user.rb:62:in `create_reset_digest'
app/controllers/password_resets_controller.rb:12:in `create'
app/models/user.rb
class User < ApplicationRecord
attr_accessor :remember_token, :activation_token, :reset_token
before_save :downcase_email
before_create :create_activation_digest
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 , allow_nil: true
# Returns the hash digest of the given string.
def User.digest(string)
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end
# Returns a random token.
def User.new_token
SecureRandom.urlsafe_base64
end
# Remembers a user in the database for use in persistent sessions.
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest, User.digest(remember_token))
end
# Returns true if the given token matches the digest.
def authenticated?(remember_token)
return false if remember_digest.nil?
BCrypt::Password.new(remember_digest).is_password?(remember_token)
end
# Forgets a user.
def forget
update_attribute(:remember_digest, nil)
end
def authenticated?(attribute, token)
digest = send("#attribute_digest")
return false if digest.nil?
BCrypt::Password.new(digest).is_password?(token)
end
# Activates an account.
def activate
update_columns(activated: FILL_IN, activated_at: FILL_IN)
end
# Sends activation email.
def send_activation_email
UserMailer.account_activation(self).deliver_now
end
# Sets the password reset attributes.
def create_reset_digest
self.reset_token = User.new_token
update_columns(reset_digest: FILL_IN, reset_sent_at: FILL_IN)
end
# Sends password reset email.
def send_password_reset_email
UserMailer.password_reset(self).deliver_now
end
# Returns true if a password reset has expired.
def password_reset_expired?
reset_sent_at < 2.hours.ago
end
private
# Converts email to all lower-case.
def downcase_email
self.email = email.downcase
end
# Creates and assigns the activation token and digest.
def create_activation_digest
self.activation_token = User.new_token
self.activation_digest = User.digest(activation_token)
end
end
app/controllers/password_resets_controller.rb
class PasswordResetsController < ApplicationController
before_action :get_user, only: [:edit, :update]
before_action :valid_user, only: [:edit, :update]
before_action :check_expiration, only: [:edit, :update] # Case (1)
def new
end
def create
@user = User.find_by(email: params[:password_reset][:email].downcase)
if @user
@user.create_reset_digest
@user.send_password_reset_email
flash[:info] = "Email sent with password reset instructions"
redirect_to root_url
else
flash.now[:danger] = "Email address not found"
render 'new'
end
end
def edit
end
def update
if params[:user][:password].empty?
@user.errors.add(:password, "can't be empty")
render 'edit'
elsif @user.update_attributes(user_params)
log_in @user
@user.update_attribute(:reset_digest, nil)
flash[:success] = "Password has been reset."
redirect_to @user
else
render 'edit'
end
end
private
def user_params
params.require(:user).permit(:password, :password_confirmation)
end
# Before filters
def get_user
@user = User.find_by(email: params[:email])
end
# Confirms a valid user.
def valid_user
unless (@user && @user.activated? &&
@user.authenticated?(:reset, params[:id]))
redirect_to root_url
end
end
# Checks expiration of reset token.
def check_expiration
if @user.password_reset_expired?
flash[:danger] = "Password reset has expired."
redirect_to new_password_reset_url
end
end
end
当我尝试查看用户时,我收到以下错误
NameError in UsersController#show
uninitialized constant UsersController::FILL_IN
Extracted source (around line #12):
def show
@user = User.find(params[:id])
(the code below being red)
redirect_to root_url and return unless FILL_IN
end
def new
来源:
app/controllers/users_controller.rb:12:in `show'
app/controllers/users_controller.rb
class UsersController < ApplicationController
before_action :logged_in_user, only: [:index, :edit, :update, :destroy]
before_action :correct_user, only: [:edit, :update]
before_action :admin_user, only: :destroy
def index
@users = User.where(activated: FILL_IN).paginate(page: params[:page])
end
def show
@user = User.find(params[:id])
redirect_to root_url and return unless FILL_IN
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
@user.send_activation_email
flash[:info] = "Please check your email to activate your account."
redirect_to root_url
else
render 'new'
end
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
if @user.update_attributes(user_params)
flash[:success] = "Profile updated"
redirect_to @user
else
render 'edit'
end
end
def destroy
User.find(params[:id]).destroy
flash[:success] = "User deleted"
redirect_to users_url
end
# Returns true if the given token matches the digest.
def authenticated?(attribute, token)
digest = send("#attribute_digest")
return false if digest.nil?
BCrypt::Password.new(digest).is_password?(token)
end
private
def user_params
params.require(:user).permit(:name, :company, :phone, :email, :password,
:password_confirmation)
end
# Confirms a logged-in user.
def logged_in_user
unless logged_in?
store_location
flash[:danger] = "Please log in."
redirect_to login_url
end
end
# Confirms the correct user.
def correct_user
@user = User.find(params[:id])
redirect_to(root_url) unless @user == current_user
end
def admin_user
redirect_to(root_url) unless current_user.admin?
end
end
我已经在这个网站上搜索了一天多的帖子,并在不同的帖子上寻找答案,并回顾和重做我的步骤,但我不知道我做错了什么。
我无法访问用户页面,当我提交忘记密码时出现错误
【问题讨论】:
它说 FILL_IN 你应该在那里输入代码。作为练习的一部分,他把那些留空了,所以你应该弄清楚里面有什么,然后编写代码。 @RockwellRice 我真的是 Ruby 新手,我在教程中找不到我应该填写的内容,我认为它会自己获取该参数? 不,它不会自己发生,他基本上是说练习的一部分是弄清楚那里的代码。我会重新阅读那一章,看看你是否能很好地理解它以填补它。这就是重点。例如,在该 show 方法中,除非满足什么条件,否则您希望重定向回根 url?一旦你知道了答案,然后弄清楚如何用代码检查它。这不是你当时没有经历过的事情,所以这不是你必须弄清楚的新事物。 【参考方案1】:def index
@users = User. where(activated: true) . paginate(page: params[:page] )
end
def show
@user = User. find(params[:id] )
redirect_to root_url and return unless true
end
def activate
update_columns(activated: true, activated_at: Time.zone.now)
end
【讨论】:
【参考方案2】:应该是:
update_columns(reset_digest: User.digest(reset_token), reset_sent_at: Time.zone.now)
【讨论】:
【参考方案3】:def index
@users = User.where(activated: true).paginate(page: params[:page])
end
def show
@user = User.find(params[:id])
redirect_to root_url and return unless @user.activated?
@microposts = @user.microposts.paginate(page: params[:page])
end
【讨论】:
考虑添加一个简短说明,说明此代码对您的答案的作用以上是关于Michael Hartl Rails 教程第 11 和 12 章:多个错误和邮件未发送的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails Michael Hartl第9章测试失败
在Michael Hartl的Ruby on Rails教程中获取错误消息:MicropostsController中的NoMethodError #create,如何避免收到此消息?
如何解决 Arel 与 Hartl Rails 教程(第 2 章)不兼容的问题?