0

我正在尝试遵循本教程的第 2.1 节

当我创建一个新用户时,我只会收到以下消息:

NameError in UsersController#create

uninitialized constant UsersController::UserMailer

我从 ROR 休息了一段时间,现在我发现我忘记了很多!

此错误的最可能原因是什么?

我的邮件程序(控制器):app/mailers/usermailer.rb:

class Usermailer < ActionMailer::Base
  default from: "from@example.com"

  def welcome_email(user)
    @user = user
    @url = 'http://example.com/login'
    mail(to: @user.email, subject: 'Welcome to my awesome site')
  end
end

我的观点:app/usermailer/welcome_email.html.erb:

<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1>Welcome to example.com, <%= @user.name %></h1>
    <p>
      You have successfully signed up to example.com,
      your username is: <%= @user.login %>.<br/>
    </p>
    <p>
      To login to the site, just follow this link: <%= @url %>.
    </p>
    <p>Thanks for joining and have a great day!</p>
  </body>
</htm>

不知道这被归类为什么。用户控制器中的“视图调用”到视图welcome_email 到@user:

   UserMailer.welcome_email(@user).deliver

这是在 app/controllers/users_controller.rb 的上下文中:

class UsersController < ApplicationController
  # GET /users
  # GET /users.json
  def index
    @users = User.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @users }
    end
  end

  # GET /users/1
  # GET /users/1.json
  def show
    @user = User.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @user }
    end
  end

  # GET /users/new
  # GET /users/new.json
  def new
    @user = User.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @user }
    end
  end

  # GET /users/1/edit
  def edit
    @user = User.find(params[:id])
  end

  # POST /users
  # POST /users.json
  def create
    @user = User.new(params[:user])

    respond_to do |format|
      if @user.save

#

    # send welcome email after save
    UserMailer.welcome_email(@user).deliver

#

        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render json: @user, status: :created, location: @user }
      else
        format.html { render action: "new" }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /users/1
  # PUT /users/1.json
  def update
    @user = User.find(params[:id])

    respond_to do |format|
      if @user.update_attributes(params[:user])
        format.html { redirect_to @user, notice: 'User was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /users/1
  # DELETE /users/1.json
  def destroy
    @user = User.find(params[:id])
    @user.destroy

    respond_to do |format|
      format.html { redirect_to users_url }
      format.json { head :no_content }
    end
  end
end
4

1 回答 1

0

你把你的大写混在一起了。您应该使用UserMailer(带有大写“M”)来引用常量(又名类)以及user_mailer文件和目录名称。

因此,对于您的邮件程序,文件名应该是app/mailers/user_mailer.rb然后使用:

class UserMailer < ActionMailer::Base

定义类。

您还需要将邮件程序的视图放在app/views/user_mailer/welcome_email.html而不是app/usermailer/welcome_email.html.erb.

Rails 试图从该错误消息(未初始化的常量 UsersController::UserMailer)中告诉您的是,UsersController 无法在UserMailer任何地方找到调用的常量。它检查了具有文件名的文件的加载路径,user_mailer.rb但找不到它,因为您的文件没有正确地蛇形大小写。如果您单独解决了这个问题,那么接下来它会抱怨它希望user_mailer.rb定义UserMailer常量。rails 这样做的方式是:

# First, going from the constant to the file name to look for:
UserMailer.name.underscore  # => 'user_mailer'

# Now, going from the file name to the expected constant defined in that file:
'user_mailer`.classify  # => 'UserMailer'
'UserMailer'.constantize  # => UserMailer
于 2013-08-31T03:48:13.333 回答