0

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

私のコードは以下です。助けてくれてありがとう!

記入済みのフォーム

<%= 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

終わり

4

1 に答える 1

0

リファクタリングを提案させてください。

これは、多対多関連の良い候補のようです。nested_form gemをインストールします。ネストされたフォームの詳細については、Railscastsを確認してください

class Cart < ActiveRecord::Base
 has_many :line_items
 has_many :gears, through: line_items

 attr_accessible :line_items_attributes

 accepts_nested_attributes_for :line_items

 def total_price
  gears.sum(:price)
 end
end

class Gear < ActiveRecord::Base
 has_many :line_items
 has_many :carts, through: line_items
end

class LineItem < ActiveRecord::Base
 belongs_to :cart
 belongs_to :gear

 attr_accessible :cart_id, :gear_id
end

今、あなたのカートコントローラで

def new
 @cart = Cart.new
end

よりクリーンなビューのためにsimple_formを使用します。使用を検討する必要があります。

Nested_form は、jquery を介して項目の追加と削除を処理します:)

<%= simple_nested_form_for @cart do |f| %>
  <%= f.simple_fields_for :line_items do |item| %>
   <%= item.input :rentstart %>
   <%= item.input :rentend %>

   #Select your gear like this
   <%= item.association :gear, as: :collection, label_method: :gear.nameorwhatever, value_method: :gear.id %>

   #Remove items using this link
   <%= item.link_to_remove "Remove this task" %>
  <% end %>

  #Add new item
  <p><%= f.link_to_add "Add an item", :tasks %></p>
<% end %>

カート コントローラーの create アクションは標準です。accept_nested_attributes for は、魔法のように lineItems を更新します。

于 2012-12-18T08:24:52.940 に答える