Maths not working (can't get this)

I’ve got a few problems with this…Hopefully it’s cleaer what I’m
trying to do (work out and display two prices, one discounted / one
full). Be grateful for answers…

The total price and discounted price are not calculated correctly and
the duration is not coming through to the output page.


class Course < ActiveRecord::Base

has_one :enquiry

attr_accessor :duration_in_weeks

def self.all_courses
find(:all)
end

def self.active_courses
# find(:all)
# find(:all, :conditions => [“active = ?”, true], :order =>
‘created_at DESC’, :limit => 5)
find(:all, :conditions => {:archive => false}, :order =>
‘display_order ASC’, :limit => 100)
end

def self.old_courses
# find(:all)
# find(:all, :conditions => [“active = ?”, true], :order =>
‘created_at DESC’, :limit => 5)
find(:all, :conditions => {:archive => true}, :order => ‘created_at
DESC’, :limit => 100)
end

def discounted_price
factor = case @duration_in_weeks
when 1…4
1.0
when 5…12
0.9
when 13…24
0.8
when 25…47
0.7
else # from 48 and up
0.6
end

total_price * factor

end

def total_price
(@duration_in_weeks * price_per_week) + registration_fee
end

def duration_in_weeks=(duration_in_weeks)
@duration_in_weeks = duration_in_weeks.to_i
end

end

CONTROLLER

class InvoiceController < ApplicationController

def index
@enquiry = Enquiry.new
@courses = Course.active_courses
@courses = Course.active_courses
render :layout => “welcome”
end

def price

if params[:id]

if params[:course[:id]]

if params[:course][:id].empty?

flash[:notice] = 'You must select a course.'
redirect_to :action => "index"

else

if params[:course][:course_duration].empty?

  flash[:notice] = 'You must select a duration.'
  redirect_to :action => "index"

else

  @time = Time.now
  # @selected_course = Course.find_by_id(params[:course][:id])
  @duration = params[:course][:course_duration]
  # @total_price = (@duration.to_i *

@selected_course.price_per_week) + @selected_course.registration_fee

  # @course = Course.find(params[:id])
  # @selected_course.discounted_price

  @course = Course.find(params[:course][:id])
  @course.duration_in_weeks = params[:course][:duration]
  # @course.discounted_price  <- not needed here.

  render :layout => "welcome"

end

end

end

end


INPUT PAGE

<% form_tag :action => ‘price’ do %>

Select a course in the box below

<%= collection_select(:course, :id, @courses, :id, :name, options
={:prompt => “-Select a course”}, :class =>“course”) %>

Select a duration (weeks) in the box below

<%= select(‘course’, ‘course_duration’, 1…52, { :include_blank => true
} ) %>

<%= submit_tag “Proceed to quotation” %>
<% end %>


OUTPUT PAGE


<%= @course.name %>



<%= @time.to_formatted_s(:long_ordinal) %>

Price per week: <%= number_to_currency(@course.price_per_week, :unit => "£", :separator => ".", :delimiter => ",") %>
Duration: <%= @course.duration_in_weeks %> weeks
Registration Fee: <%= number_to_currency(@course.registration_fee, :unit => "£", :separator => ".", :delimiter => ",") %>

Total Price: <%= number_to_currency(@course.total_price, :unit => "£", :separator => ".", :delimiter => ",") %>

Discounted Price: <%= number_to_currency(@course.discounted_price,
:unit => “£”, :separator => “.”, :delimiter => “,”) %>


Please note that this price is indicative and not a binding quotation. The price excludes any fees for accommodation, travel and examinations. Terms and conditions apply.

<%= button_to “Return to pricing page”, :action => “index” %>

On 25 Aug 2008, at 13:36, bingo bob wrote:

I’ve got a few problems with this…Hopefully it’s cleaer what I’m
trying to do (work out and display two prices, one discounted / one
full). Be grateful for answers…

It’s basically impossible to read this because there are almost more
commented out lines than actual lines.
That said you’re checking whether params[:course][:course_duration]
is empty but then you’re using params[:course][:duration] instead.

Fred

Frederick C. wrote:

On 25 Aug 2008, at 13:36, bingo bob wrote:

I’ve got a few problems with this…Hopefully it’s cleaer what I’m
trying to do (work out and display two prices, one discounted / one
full). Be grateful for answers…

It’s basically impossible to read this because there are almost more
commented out lines than actual lines.
That said you’re checking whether params[:course][:course_duration]
is empty but then you’re using params[:course][:duration] instead.

Fred

You got it thanks…

Now I’ve decided I want to access factor in my view…

but it’s blank when i try
Factor: <%= @course.factor %>

here’s my model…

class Course < ActiveRecord::Base

has_one :enquiry

attr_accessor :duration_in_weeks
attr_reader :factor

def self.all_courses
find(:all)
end

def self.active_courses
# find(:all)
# find(:all, :conditions => [“active = ?”, true], :order =>
‘created_at DESC’, :limit => 5)
find(:all, :conditions => {:archive => false}, :order =>
‘display_order ASC’, :limit => 100)
end

def self.old_courses
# find(:all)
# find(:all, :conditions => [“active = ?”, true], :order =>
‘created_at DESC’, :limit => 5)
find(:all, :conditions => {:archive => true}, :order => ‘created_at
DESC’, :limit => 100)
end

def discounted_price
@factor = case @duration_in_weeks
when 1…4
1.0
when 5…12
0.9
when 13…24
0.8
when 25…47
0.7
else # from 48 and up
0.6
end

total_price * @factor

end

def total_price
(@duration_in_weeks * price_per_week) + registration_fee
end

def duration_in_weeks=(duration_in_weeks)
@duration_in_weeks = duration_in_weeks.to_i
end

end