简体   繁体   English

行动邮件和护栏4种方法

[英]action mailer and rails 4 methods

I have been following quite an old tutorial in order to create a contact form and then create a mailer that sends to the site admin. 我一直在遵循相当古老的教程,以便创建联系表,然后创建发送给站点管理员的邮件程序。 I am running into some problems i think because i am on rails 4.1.1 and the tutorial is so old! 我认为我遇到了一些问题,因为我在Rails 4.1.1上并且本教程太旧了! I was wondering if anyone could give me some guidance-i am learning rails. 我想知道是否有人可以给我一些指导-我正在学习Rails。 The error i am currently getting is as follows NoMethodError in MessagesController#create undefined method `deliver_message' for ContactMailer:Class 我当前遇到的错误如下,即MessagesController#create ContactMailer:Class的未定义方法`deliver_message'中的NoMethodError

here is my code 这是我的代码

messages controller: 消息控制器:

class MessagesController < ApplicationController
  before_action :set_message, only: [:show, :edit, :update, :destroy]

  # GET /messages
  # GET /messages.json
  def index
    @messages = Message.all
  end

  # GET /messages/1
  # GET /messages/1.json
  def show
  end

  # GET /messages/new
  def new
    @message = Message.new
  end

  # GET /messages/1/edit
  def edit
  end

  # POST /messages
  # POST /messages.json
  def create
    @message = Message.new(message_params)

    respond_to do |format|
      if @message.save
        ContactMailer.deliver_message(@message)
        flash.now[:notice] = 'Thank you for your message!'
        format.html { redirect_to root_path }
        format.json { render :show, status: :created, location: @message }
      else
        format.html { render :new }
        format.json { render json: @message.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /messages/1
  # PATCH/PUT /messages/1.json
  def update
    respond_to do |format|
      if @message.update(message_params)
        format.html { redirect_to @message, notice: 'Message was successfully updated.' }
        format.json { render :show, status: :ok, location: @message }
      else
        format.html { render :edit }
        format.json { render json: @message.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /messages/1
  # DELETE /messages/1.json
  def destroy
    @message.destroy
    respond_to do |format|
      format.html { redirect_to messages_url, notice: 'Message was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_message
      @message = Message.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def message_params
      params.require(:message).permit(:name, :email, :company, :phone, :subject, :body)
    end
end

development.rb: development.rb:

Rails.application.configure do
  # Settings specified here will take precedence over those in config/application.rb.

  # In the development environment your application's code is reloaded on
  # every request. This slows down response time but is perfect for development
  # since you don't have to restart the web server when you make code changes.
  config.cache_classes = false

  # Do not eager load code on boot.
  config.eager_load = false

  # Show full error reports and disable caching.
  config.consider_all_requests_local       = true
  config.action_controller.perform_caching = false

  # Don't care if the mailer can't send.
  config.action_mailer.raise_delivery_errors = true

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    address: "smpt.gmail.com",
    port: "587",
    domain: "gmail.com",
    authentication: "plain",
    enable_starttls_auto: true,
    user_name: 'your_email_username',
    password: 'your_email_password'
  }

  CONTACT_RECIPIENT = 'yourname@yourdomain.com'
  # Print deprecation notices to the Rails logger.
  config.active_support.deprecation = :log

  # Raise an error on page load if there are pending migrations.
  config.active_record.migration_error = :page_load

  # Debug mode disables concatenation and preprocessing of assets.
  # This option may cause significant delays in view rendering with a large
  # number of complex assets.
  config.assets.debug = true

  # Adds additional error checking when serving assets at runtime.
  # Checks for improperly declared sprockets dependencies.
  # Raises helpful error messages.
  config.assets.raise_runtime_errors = true

  # Raises error for missing translations
  # config.action_view.raise_on_missing_translations = true

  # Required for Devise gem
  config.action_mailer.default_url_options = { :host => 'localhost:3000' }

end

contact_mailer.rb contact_mailer.rb

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

  # Subject can be set in your I18n file at config/locales/en.yml
  # with the following lookup:
  #
  #   en.contact_mailer.message.subject
  #

    def message(message)
    subject    message.subject
    body       :message => message
    recipients CONTACT_RECIPIENT
    from       message.email
    sent_on    Time.now
    end

  end
end

having then changed def message to def deliver_message(message) i then get the following error 然后将def消息更改为def delivery_message(message),然后出现以下错误

NoMethodError in MessagesController#create
undefined method `subject' for #<ContactMailer:0x007fdb5d7e0028>
  subject    message.subject

The solution is as simple as changing 解决方案就像更改一样简单

def message(message)
end

to

def deliver_message(message)
end

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM