So it seems as if I always run into an issue when setting up a mailer in development mode, I cant see anything wrong with my setup, maybe someone else can see something? At the moment when i send an email via my contact form there is no redirect and the params of the email get passed via the url and the same page gets rendered
http://localhost:3000/contact?utf8=%E2%9C%93&authenticity_token=123456exampletoken%3D&message%5Bname%5D=richard+lewis&message%5Bemail%5D=richlewis14%40gmail.com&message%5Bwebsite%5D=bbc.co.uk&message%5Bmessage%5D=test%0D%0A&commit=Send+Message
Ok so my development environment looks like so
#Mailer Config
config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true
config.action_mailer.default_url_options = { host: "localhost:3000" }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: "smtp.gmail.com",
port: 587,
domain: "gmail.com",
authentication: "plain",
enable_starttls_auto: true,
user_name: "myusername",
password: "mypassword"
}
I have a Contact Controller
class ContactController < ApplicationController
def new
@message = Message.new
end
def create
@message = Message.new(params[:message])
if @message.valid?
ContactMailer.send_mail(@message).deliver
redirect_to(root_path, :notice => "Thanks for your message, I will be in touch soon")
else
render :new
end
end
end
Mailer
class ContactMailer < ActionMailer::Base
default from: "richlewis14@gmail.com"
def send_mail(message)
@message = message
mail(to: "richlewis14@gmail.com", subject: "Message From Blog Site")
end
end
Mailer text File
<p> You have a new Email</p>
<p><%= @contact.name %></p>
<p><%= @contact.email %></p>
<p><%= @contact.website %></p>
<p><%= @contact.message %></p>
Message model
class Message
include ActiveModel::Validations
include ActiveModel::Conversion
extend ActiveModel::Naming
attr_accessor :name, :email, :website, :message
def initialize(attributes = {})
attributes.each do |name, value|
send("#{name}=", value)
end
end
def persisted?
false
end
end
And finally my routes
#CONTACT FORM
match 'contact' => 'contact#new', :as => 'contact', :via => :get
match 'contact' => 'contact#create', :as => 'contact', :via => :post
UPDATE
Ok so despite suggestions below i cannot get my form to post, it keeps rendering a get request, my form looks like so
<div id="contact-form-wrap">
<form id="contact-form">
<%= form_for @message, :url => contact_path, :method => :post do |f| %>
<span class="c-note">Asunt in anim uis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in anim id est laborum. Allamco laboris nisi ut aliquip ex ea commodo consequat. Aser velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint</span>
<div class="contact-left">
<p class="input-block clearfix">
<%= f.text_field :name, :id => 'contact_name', :placeholder => 'Name' %>
</p>
<p class="input-block">
<%= f.text_field :email, :id => 'contact_email', :placeholder => 'Email' %>
</p>
<p class="input-block last">
<%= f.text_field :website, :id => 'contact_url', :placeholder => 'Website' %>
</p>
</div><!--end:contact-left-->
<div class="contact-right">
<p class="textarea-block">
<%= f.text_area :message, :id => 'contact_message', :rows => 6, :placeholder => 'Message' %>
</p>
</div><!--end:contact-right-->
<div class="clear"></div>
<p class="contact-button clearfix">
<%= f.submit 'Send Message', :id => 'submit-contact' %>
</p>
<div class="clear"></div>
<% end %>
</form>
</div><!--contact-form-wrap-->
it appears that your form (not shown) is using a GET method, and not matching the create route which is post. Try changing the Form in your view to use POST. and that should invoke the create method. Looking in your logs I am guessing it is executing the new method
change this.
<form id="contact-form">
<%= form_for @message, :url => contact_path, :method => :post do |f| %>
to this
<%= form_for @message, :url => contact_path, :method => :post, :html => {:id => 'contact-form' } do |f| %>
and remove the last </form>
as well. since the form_for helper will add it as part of the block. This will remove the nested forms, and should allow you to post / send mail.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.