ユーザーが時間単位または日単位で製品を購入できるレール フォームがあります。ショッピング カートを使用して、購入した各アイテムを追跡しています。フォームが送信されると、カートに項目オブジェクトが渡されます。アイテムの価格を変更し、ユーザーが購入に時間単位または日単位のどちらを選択したかに基づいてコスト計算に変更する必要があります。パラメータをテストする方法と、アイテムのモデルまたはコントローラーでこれを行う必要があるかどうかはわかりません。
私のコードは以下です。助けてくれてありがとう!
記入済みのフォーム
<%= 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
終わり