Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,6 @@ MAILER_SENDER_ADDRESS=noreply@example.com

# comma separated list of IP adresses
# IP_WHITELIST=127.0.0.1

# Admin email adress
ADMIN_EMAIL=admin@example.com
17 changes: 17 additions & 0 deletions app/controllers/feedbacks_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
class FeedbacksController < ApplicationController
expose(:feedback)

def new
end

def create
ApplicationMailer.feedback(feedback).deliver_now! if feedback.save
respond_with(feedback, location: root_path)
end

private

def feedback_params
params.require(:feedback).permit(:email, :name, :text)
end
end
5 changes: 5 additions & 0 deletions app/mailers/application_mailer.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
class ApplicationMailer < ActionMailer::Base
layout "mailer"

def feedback(feedback)
@feedback = feedback
mail(subject: "Feedback", from: feedback.email, to: ENV.fetch("ADMIN_EMAIL"))
end
end
13 changes: 13 additions & 0 deletions app/models/feedback.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
class Feedback
include ActiveModel::Model

attr_accessor :email, :name, :text

validates :email, presence: true, format: Devise.email_regexp
validates :name, presence: true
validates :text, presence: true

def save
valid?
end
end
11 changes: 11 additions & 0 deletions app/views/application_mailer/feedback.html.slim
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
header
| Hello, this feedback is from #{@feedback.name}

hr
blockquote
p
= @feedback.text
hr

footer
| from: #{@feedback.email}
15 changes: 15 additions & 0 deletions app/views/application_mailer/feedback.text.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<header>
Hello, this feedback is from <%= @feedback.name %>
</header>

<hr>
<blockquote>
<p>
<%= @feedback.text %>
</p>
</blockquote>
<hr>

<footer>
from: <%= @feedback.email %>
</footer>
14 changes: 14 additions & 0 deletions app/views/feedbacks/new.html.slim
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
.row
.medium-5.columns
= simple_form_for(feedback) do |f|

legend
| Send Your Feedback

.form-inputs
= f.input :email, required: true, autofocus: true
= f.input :name, required: true
= f.input :text, as: :text, required: true

.form-actions
= f.button :submit, "Submit feedback"
4 changes: 4 additions & 0 deletions config/locales/flash.en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,7 @@ en:
destroy:
notice: '%{resource_name} was successfully destroyed.'
alert: '%{resource_name} could not be destroyed.'
feedbacks:
create:
notice: Feedback was successfully send!
alert: Your feedback has not been sent.
2 changes: 2 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
Rails.application.routes.draw do
devise_for :users, controllers: { registrations: "users/registrations" }
root to: "pages#home"

resources :feedbacks, only: %i[new create]
end
7 changes: 7 additions & 0 deletions spec/factories/feedback.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
FactoryGirl.define do
factory :feedback do
email
name { Faker::Name.name }
text { Faker::Lorem.paragraph }
end
end
32 changes: 32 additions & 0 deletions spec/features/visitor/feedback/create_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
require "rails_helper"

feature "Create Feedback" do
let(:feedback_attributes) { attributes_for(:feedback) }

scenario "Visitor creates his feedback" do
visit new_feedback_path

fill_form :feedback, feedback_attributes

click_button "Submit feedback"

open_email(ENV.fetch("ADMIN_EMAIL"))

expect(current_email).to have_subject("Feedback")
expect(current_email).to be_delivered_from(feedback_attributes[:email])

expect(current_email).to have_body_text(feedback_attributes[:name])
expect(current_email).to have_body_text(feedback_attributes[:email])
expect(current_email).to have_body_text(feedback_attributes[:text])

expect(page).to have_content("Feedback was successfully send!")
end

scenario "Visitor cannot creates his feedback" do
visit new_feedback_path

click_button "Submit feedback"

expect(page).to have_content("Your feedback has not been sent.")
end
end
7 changes: 7 additions & 0 deletions spec/models/feedback_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
require "rails_helper"

describe Feedback do
it { is_expected.to validate_presence_of :name }
it { is_expected.to validate_presence_of :email }
it { is_expected.to validate_presence_of :text }
end