Hi i'm abit of a noob and i'd appreciate any help with this. I am trying to use the data a user saved into their address book, after which I would like to give them the option of using the address for delivery.
Here is my Address controller
class AddressesController < ApplicationController
before_action :authenticate_user!
before_action :set_address, only: [ :show, :edit, :update, :destroy]
# GET /addresses
# GET /addresses.json
def index
@addresses = current_user.addresses.all
end
# GET /addresses/1
# GET /addresses/1.json
def show
end
# GET /addresses/new
def new
@address = current_user.addresses.build
end
# GET /addresses/1/edit
def edit
end
# POST /addresses
# POST /addresses.json
def create
@address = current_user.addresses.build(address_params)
@address = current_user
respond_to do |format|
if @address.save
format.html { redirect_to addresses_url, notice: 'Address was successfully created.' }
format.json { render :show, status: :created, location: @address }
else
format.html { render :new }
format.json { render json: @address.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /addresses/1
# PATCH/PUT /addresses/1.json
def update
respond_to do |format|
if @address.update(address_params)
format.html { redirect_to @address, notice: 'Address was successfully updated.' }
format.json { render :show, status: :ok, location: @address }
else
format.html { render :edit }
format.json { render json: @address.errors, status: :unprocessable_entity }
end
end
end
# DELETE /addresses/1
# DELETE /addresses/1.json
def destroy
@address.destroy
respond_to do |format|
format.html { redirect_to addresses_url, notice: 'Address was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_address
@address = Address.find(params[:id])
end
# Only allow a list of trusted parameters through.
def address_params
params.require(:address).permit(:address, :latitude, :longitude)
end
end
and my address form, this uses a google maps api to get a users long and lat
<%= simple_form_for(@address) do |f| %>
<p class="text-danger" style="width: 500px;">Your address will only be used for deliveries. This is mainly for locating unknown land marks like a household not for use of well known companies or easily locatable land marks. Eg "Little Bay Peer". Mobile users may allow location as it will be more accurate, users on a computer should use the map.</p>
<div class="form-inputs" style="width: 500px">
<%= f.input :address %>
<%= f.input :latitude, id: "address_latitude" %>
<%= f.input :longitude, id: "address_longitude" %>
</div>
<em>Please use the zoom button while redirecting the marker to the exact location you want your delivery </em>
<p>
<div id="map2" ></div>
</p>
<div class="form-actions">
<%= f.button :submit, class: "btn btn-success" %><br><br>
</div>
<% end %>
</div>
Here is where where i'm unsure about this is my already order controller
before_action :authenticate_user!
before_action :set_already_order, only: [:show, :edit, :update, :destroy]
# GET /already_orders
# GET /already_orders.json
def index
@already_orders = current_user.already_orders.order('created_at desc')
end
# GET /already_orders/1
# GET /already_orders/1.json
def show
end
# GET /already_orders/new
def new
@already_order = current_user.already_orders.build
end
# GET /already_orders/1/edit
def edit
end
# POST /already_orders
# POST /already_orders.json
def create
@already_order = current_user.already_orders.build(already_order_params)
@already_order = current_user
respond_to do |format|
if @already_order.save
format.html { redirect_to already_orders_url , notice: 'Already order was successfully created.' }
format.json { render :show, status: :created, location: @already_order }
else
format.html { render :new }
format.json { render json: @already_order.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /already_orders/1
# PATCH/PUT /already_orders/1.json
def update
respond_to do |format|
if @already_order.update(already_order_params)
format.html { redirect_to already_orders_url, notice: 'Already order was successfully updated.' }
format.json { render :show, status: :ok, location: @already_order }
else
format.html { render :edit }
format.json { render json: @already_order.errors, status: :unprocessable_entity }
end
end
end
# DELETE /already_orders/1
# DELETE /already_orders/1.json
def destroy
@already_order.destroy
respond_to do |format|
format.html { redirect_to already_orders_url, notice: 'Already order was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_already_order
@already_order = AlreadyOrder.find(params[:id])
end
# Only allow a list of trusted parameters through.
def already_order_params
params.require(:already_order).permit(:shop_name,
:pick_up_time,
:shop_address,
:shop_district,
:delivery_time,
:item_type,
:item_cost,
:item_quantity,
:name,
:address,
:district,
:building,
:phone_number,
:specific_instructions,
:payment_method,
:cost,
:deliver_id,
:payment_status,
:specify_delivery_time,
:paid_for,
:discount_code,
:delivery_status,
:cost_usd)
end
end
This is my already order form
<%= form_for(@already_order) do |f| %>
<div class="row p-3 pt-5">
<div class="col-md-8 order-md-1">
<h3 class="mb-3 text-muted">Pickup Details</h3>
<div class="form-row">
<div class="form-group form-group col-md-6">
<label>Business name</label>
<%= f.hidden_field :deliver_id, value: SecureRandom.hex(5) %>
<%= f.hidden_field :payment_status, value: "Pending" %>
<%= f.hidden_field :delivery_status %>
<%= f.text_field :shop_name, class:"form-control", placeholder: "Grand Phenix", required: true %>
</div>
<div class="form-group col-md-6">
<label>Business address</label>
<%= f.text_field :shop_address, class:"form-control", placeholder: "Brades", required: true %>
</div>
<div class="form-group col-md-9">
<label>Business district</label><em style="font-size: 12px;"> if business district and delivery district are diffrent you will be charged $4</em>
<%= f.select :shop_district, ['','Cojoehead - Sweenyes', "St. John's - Look Out" , 'Cheapend - Salem'], {}, { :class => 'form-control', :id => 'dist1', :onchange => 'addto()' } %>
</div>
<div class="form-group col-md-3">
<%= f.label :pick_up_time %>
<div class="form-inline">
<%= f.datetime_select :pick_up_time, { ampm: true, order: [:hour, :minute] }, { class:"form-control", :required => true } %>
</div>
</div>
<div class="form-group col-md-5">
<label>Address</label>
<%= f.select("address", Address.all.collect {|p| [ p.address ] },{}, { :class => 'form-control' })%>
</div>
<div class="form-group col-md-5">
<label>Item Type</label>
<%= f.select :item_type, ['','Food & Drinks', "Groceries" , 'Packages'], {}, { :class => 'form-control', :id => 'sitem', :onchange => 'addto()' } %>
</div>
<p id="item_cost"></p>
<p id="dis_cost"></p>
<div class="form-group col-md-4">
<label>Item Quantity or Weight in lbs</label>
<%= f.number_field :item_quantity, class: 'form-control' , id:'weight', :onchange => 'addto()' %>
</div>
<div class="form-group col-md-3">
<%= f.label :delivery_time %>
<div class="form-inline">
<%= f.select :delivery_time, ['8:00 am', '11:50 am', '3:00 pm', '7:30 pm'], {}, { :class => 'form-control' } %>
</div>
</div>
</div><br><br><br>
<h3 class="text-muted">Delivery Details </h3>
<div class="form-row">
<div class="form-group col-md-5">
<%= f.label :name %>
<%= f.text_field :name, class:"form-control", placeholder: "John Browne", required: true %>
</div>
<div class="form-group col-md-5">
</div>
<div class="form-group col-md-6">
<%= f.label :building %>
<%= f.text_field :building, class:"form-control", placeholder: "Third house on the right", required: true %>
</div>
<div class="form-group col-md-10">
<%= f.label :district %><em style="font-size: 12px;"> if delivery district and shop district are diffrent you will be charged $4</em>
<%= f.select :district, ['','Cojoehead - Sweenyes', "St. John's - Look Out" , 'Cheapend - Salem'], {}, { :class => 'form-control', :id => 'dist2', :onchange => 'addto()' } %>
</div>
<div class="form-group col-md-4">
<%= f.label :phone_number %>
<%= f.number_field :phone_number, class:"form-control", placeholder: "393-0000", required: true %>
</div>
<div class="form-group col-md-10">
<%= f.label :specific_instructions %>
<%= f.text_area :specific_instructions, class:"form-control", placeholder: "Knock on the pink door downstairs and deliver it to Tim Browne ", :size => "24x6", :required => true %>
</div>
</div>
<!-- Button trigger modal -->
<div class="ml-3">
<input class="form-check-input" type="checkbox" required>
<button type="button" class="btn btn-info" data-toggle="modal" data-target="#staticBackdrop">
Terms and Conditions
</button>
</div>
<!-- Modal -->
<div class="modal fade" id="staticBackdrop" data-backdrop="static" data-keyboard="false" tabindex="-1" role="dialog" aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="staticBackdropLabel">Instructions and Pricing</h5>
</div>
<div class="modal-body">
Please ensure that the Pickup district and delivery district are correct as you will be charged $5 for wrong details.<br><br>
<div class="mx-2"><strong>Food and Drinks</strong> <br>
<em>1 Food and Drink is are a pair as 1</em><br>
1-2 Food and Drinks = $5 <br>
3-6 Food and Drinks = $10 <br>
More and 6 Food and Drinks = $1.6 per <br>
<strong>Groceries</strong> <br>
$1.75 per lb <br>
<strong>Items</strong> <br>
$2.2 per lb </div><br><br>
<h5>Paymant options</h5>
<div class="mx-2"><strong>Already paid</strong> - The item is already paid for and it ready for pick up <br>
<strong>Pay on arrival</strong> - This only applies for items under $50 where Deliver will pay for the item and apon delivery the amount will be paid back plus a $5 fee </div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">Understood</button>
</div>
</div>
</div>
</div><br><br>
</div>
<div class="col-md-4 order-md-2 mb-4 text-danger">
<h4 class="d-flex justify-content-between align-items-center mb-3">
<span class="text-muted">Charges</span>
</h4>
<ul class="list-group mb-2">
<li class="list-group-item d-flex justify-content-between lh-condensed">
<p id="pitem"></p>
<span class="text-muted" id="price"></span>
</li>
<li class="list-group-item d-flex justify-content-between lh-condensed">
<p id="district"></p>
<span class="text-muted" id="district_cost"></span>
</li>
<li class="list-group-item d-flex justify-content-between lh-condensed">
<p id="payment"></p>
<span class="text-muted" id="pay_cost"></span>
</li>
<li class="list-group-item d-flex justify-content-between lh-condensed">
<p></p>
<span class="text-muted"></span>
</li>
</ul><br>
<span class="text-muted">Payment Method</span><br>
<div>
<%= f.select :payment_method, ['Paypal/Credit Card', "Pay on Arrival"], {}, { :class => 'form-control', :id => 'pay_opt', :onchange => 'addto()' } %>
</div><br><br>
<p id="ttl1"></p>
<p id="ttl2"></p>
<p id="ttl3"></p>
<li class="list-group-item d-flex justify-content-between">
<h5>Total (EC)</h5>
<%= f.hidden_field :cost, id: "ptotal" %>
<%= f.hidden_field :cost_usd, id: "usdtotal" %>
<strong id="end"></strong>
</li>
<br>
<div class="input-group">
<%= f.hidden_field :discount_code, class: 'form-control' %>
<input type="text" class="form-control" placeholder="Discount code">
<div class="input-group-append">
<p class="btn btn-secondary">Redeem</p>
</div>
</div>
</div>
</div>
<div class="form-actions">
<%= f.button :Submit, class: "btn btn-success", id: 'display' %>
</div>
<% end %>
</div>
<p id="pay_val"></p>
<p id="end2"></p>
I use this to show the options of the addresses already saved
<%= f.select("address", Address.all.collect {|p| [ p.address ] },{}, { :class => 'form-control' })%>
But when I submit data I get a Associations miss match error, I also dont think the code is working as i want it to yet as after a order is submitted I would want the associated address name, longitude and latitude to be submitted with it.
My models association is as
class Address < ApplicationRecord
belongs_to :user
has_many :already_orders
has_many :orders
end
class AlreadyOrder < ApplicationRecord
belongs_to :user
has_one :address
end
class User < ApplicationRecord
has_many :already_orders, dependent: :destroy
has_many :orders, dependent: :destroy
has_many :addresses, dependent: :destroy
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
end
I would appreciate any help in this problem