Top > Ruby on Railsあれこれ > 2-6 お買い物情報をデータベースに保存しよう

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
-
|
|
|
|
!
 
 
-
|
|
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
CREATE TABLE `rails`.`shoppings` (
  `id` VARCHAR(32) NOT NULL,
  `userid` VARCHAR(45) NOT NULL,
  `shoppingdate` DATE NOT NULL,
  PRIMARY KEY (`id`)
)
ENGINE = InnoDB;
 
CREATE TABLE `rails`.`shoppingdetails` (
  `shoppingid` VARCHAR(32) NOT NULL,
  `no` INTEGER UNSIGNED NOT NULL DEFAULT 0,
  `productid` INTEGER UNSIGNED NOT NULL,
  `counts` INTEGER UNSIGNED NOT NULL,
  PRIMARY KEY (`shoppingid`,`no`)
)
ENGINE = InnoDB;
 
ALTER TABLE `rails`.`shoppingdetails` ADD CONSTRAINT `FK_shoppingdetail_shoppings` FOREIGN KEY `FK_shoppingdetail_shoppings` (`shoppingid`)
    REFERENCES `shoppings` (`id`)
    ON DELETE RESTRICT
    ON UPDATE RESTRICT;
 
ALTER TABLE `rails`.`shoppingdetails` ADD CONSTRAINT `FK_shoppingdetail_catalogs` FOREIGN KEY `FK_shoppingdetail_catalogs` (`productid`)
    REFERENCES `catalogs` (`id`)
    ON DELETE RESTRICT
    ON UPDATE RESTRICT;

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
<html>
<head>
  <title>ショッピングカートの内容</title>
  <%= stylesheet_link_tag 'ror' %>
</head>
<body>
購入予定のリストです。ご確認下さい。
<% @catalogs = @cart.catalogs %>
<%= list_error_messages_for "catalogs" %>
<% form_tag({:action => 'change'}) do %>
  <table border="1">
    <thead>
      <tr>
        <th>商品番号</th>
        <th>商品名</th>
        <th>価格</th>
        <th>数量</th>
        <th>小計</th>
      </tr>
    </thead>
    <tbody>
      <% for @catalog in @catalogs %>
      <tr>
        <td><%=h @catalog.id %></td>
        <td><%=h @catalog.name %>&nbsp;<%=h @catalog.detail %></td>
        <td align="right"><%= number_with_delimiter(@catalog.price, delimiter=",") %></td>
        <%# セッションに保存してあるカートの各商品の個数だけを書き換えるようにします %>
        <td><%= hidden_field("catalog[]", "id") %><%= text_field("catalog[]", "count") %></td>
        <td><%= number_with_delimiter(@catalog.price * @catalog.count.to_i, delimiter=",") %></td>
      </tr>
      <% end %>
    </tbody>
  </table>
  <br>
  <table border="1">
    <thead>
    </thead>
    <tbody>
      <tr>
        <td>合計</td>
        <td><%= number_with_delimiter(@cart.getTotalPrice, delimiter=",") %></td>
      </tr>
    </tbody>
  </table>
  <%# 複数商品の個数変更を一括して適用します %>
  <%= submit_tag "数量変更" %>
<% end %>
<br>
<%# 2-6で追加しました。%>
<% form_tag({:action => 'commit'}) do %>
  数量変更は有効になりません。数量を変更してから購入ボタンを押してください。<br>
  ユーザ名<%= text_field_tag "userid" %>
  <%= submit_tag "購入する" %>
<% end %>
<br/>
<%= link_to( "商品一覧へ戻る", {:controller => 'catalogs', :action => 'index'}) %>
</body>
</html>
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
------------------------------------------------------    
  #2-6で追加
  #1)「購入する」ボタンクリック時のアクション
  #本メソッド正常終了時にセッションに格納されていたカートは削除されます。
  def commit
    @userid = params[:userid]
    @cart = session[:cart]
    
    begin
      #トランザクション開始
      ActiveRecord::Base.transaction {
      
        shopping = Shopping.new
        shopping.userid = @userid
        #1) save!ではDB処理失敗時に例外が発生します。
        shopping.save!
      
        @cart.catalogs.each_with_index { |c, i|
            d = Shoppingdetails.new
            d.shoppingid = shopping.id
            d.no = i+1
            d.productid = c.id
            d.counts = c.count
            d.save!
        }
      }
    rescue => ex
        #例外発生時の処理を記述します。
        render :text => ex
        return
    end
    
    session[:cart] = nil
  end
------------------------------------------------------   

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
class Shopping < ActiveRecord::Base
  
  #save前にsettingメソッドをコールバックします。
  before_save :setting
  
private
  def setting
      self.id = get_id
      self.shoppingdate = Time.now #購入日時を設定します。
  end
  
  #購入IDを生成します。:UTCミリ秒+オブジェクトのハッシュコード
  def get_id
    return ((Time.now.to_f * 1000).to_i).to_s + "." + self.hash.to_s
  end
end

  0
  1
class Shoppingdetails < ActiveRecord::Base
end
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
<html>
<head>
<title>ショッピングカートの内容</title>
</head>
<body>
  <%=h @userid %>さん、ご購入ありがとうございました。
  <br>
  <%= link_to( "商品一覧へ戻る", {:controller => 'catalogs', :action => 'index'}) %>
</body>
</html>

添付ファイル: fileror-sample2-6_4.jpg 242件 [詳細] fileror-sample2-6_3.jpg 193件 [詳細] fileror-sample2-6_2.jpg 156件 [詳細] fileror-sample2-6_1.jpg 227件 [詳細]

リロード   新規 編集 凍結解除 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2012-08-08 (水) 23:25:35 (2923d)