使用Action Mailer和ROR3发送有关用户创建的电子邮件

时间:2013-08-30 17:39:03

标签: ruby-on-rails-3

我正在尝试遵循this tutorial

的第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

1 个答案:

答案 0 :(得分:0)

你正在混淆你的大写。您应该使用UserMailer(使用大写'M')来引用常量(a.k.a.类)和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