我有一个 Rails 表单,用户可以选择每小时或每天购买产品。我正在使用购物车来跟踪购买的每件商品。提交表单时,购物车会传递行项目对象。我需要根据用户选择每小时还是每天购买来更改商品的价格并更改为成本计算。我不是我应该如何测试参数以及是否应该在项目的模型或控制器中执行此操作。
我的代码如下。谢谢您的帮助!
填写的表格
<%= form_for LineItem.new do |f| %>
<p><%= render :partial => "price" %> /
<%= f.select :day_or_hour, [['day', 'day'], ['hour', 'hour']], :id => 'day_or_hour' %>
<div class="gearside_date_main">
<h3 style="font-family: 'RockSaltRegular', 'JosefinSansStdLight', Helvetica, Arial, sans-serif;color: #71a41e; font-size: 16px; margin: 15px 0 5px 15px;">Rental Date</h3>
<%= f.text_field :rentstart, id: 'rentstart', :value => "Pickup" %>
<%= f.text_field :rentend, id: 'rentend', :value => "Drop Off" %>
<%= image_tag('calendar.png', :style => "float:left; padding-top: 8px") %>
<%= f.hidden_field :gear_id, :value => @gear.id %>
</br></br>
<div class="gear_time_schedule hourlyshowhide">
<span class="gear_time_schedule_container">
<%= f.label :starthour, 'Pick Up Time', class: 'labeltext' %>
<%= f.text_field :starthour, id: 'starthour', :value => '' %>
</span>
<span class="gear_time_schedule_container">
<%= f.label :endhour, 'Drop Off Time', class: 'labeltext' %>
<%= f.text_field :endhour, id: 'endhour', :value => '' %>
</span>
</div>
<%= f.submit "", id: 'rent_it' %>
<% end %>
齿轮型号
class Gear < ActiveRecord::Base
belongs_to :user
has_many :line_items
def hourly_price
price/24
end
end
订单项模型
class LineItem < ActiveRecord::Base
belongs_to :cart
belongs_to :gear
def total_price
gear.price * quantity
end
def set_rentprice price
self.rentprice = price
end
end
行项目数据库中的参数
`id` int(11) NOT NULL AUTO_INCREMENT,
`gear_id` int(11) DEFAULT NULL,
`cart_id` int(11) DEFAULT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
`quantity` int(11) DEFAULT '1',
`rentstart` date DEFAULT NULL,
`rentend` date DEFAULT NULL,
`rentprice` decimal(10,0) DEFAULT NULL,
`starthour` varchar(255) DEFAULT NULL,
`endhour` varchar(255) DEFAULT NULL,
`day_or_hour` varchar(255) DEFAULT NULL,
`order_id` int(11) DEFAULT NULL,
在 LineItem 控制器中创建操作
def create
@cart = current_cart
case params[:day_or_hour]
when 'day'
price = Gear.weekly_price
when 'hour'
price = Gear.hourly_price # these methods have to be converted to class methods
end
gear = Gear.find(params[:line_item][:gear_id])
lineitem = LineItem.new(params[:line_item])
lineitem.set_rentprice price
@line_item = @cart.add_gear(lineitem, gear.id)
respond_to do |format|
if @line_item.save
format.html { redirect_to @line_item.cart }
format.json { render json: @line_item, status: :created, location: @line_item }
else
format.html { render action: "new" }
format.json { render json: @line_item.errors, status: :unprocessable_entity }
end
end
end
购物车型号
class Cart < ActiveRecord::Base
has_many :line_items, dependent: :destroy
def add_gear(lineitem, gear_id)
current_item = line_items.find_by_gear_id(gear_id)
if current_item
current_item.quantity += 1
else
current_item = line_items.build(lineitem)
end
current_item
end
def total_price
line_items.to_a.sum { |item| item.total_price }
end
结尾