Rails アジャイル本 第11章 タスクF:ユーザ管理(checkout アクション)

リクエストの HTTP メソッドによって checkout メソッドの振舞いを分けさせる。
GET メソッドの場合はカートの中身の状態(空か否か)によってチェックアウト・フォームの表示を制御する。
POST メソッドの場合は @order を保存する。

app/controllers/store_controller.rb

def checkout
  if request.post?          # save order
    @order = Order.new(params[:order])
    @order.add_line_items_from_cart(@cart)
    if @order.save
      session[:cart] = nil
      redirect_to_index("Thank you for your order")
    else
      render :action => "checkout"
    end
  elsif @cart.items.empty?  # redirect to index (cart is empty)
    redirect_to_index("Cart is empty, now")
  else
    @order = Order.new
  end
end

チェックアウト・フォームではアクションは save_order から checkout メソッドの実行に変更する。
app/views/store/checkout.html.erb では checkout メソッドの url は明示しなくてもよい。

<% form_for :order, :url => { :action => :save_order } do |form| %>
  ↓のように変更する
<% form_for :order do |form| %>

チェックアウト・ボタンで送信されるリクエストに GET メソッドを使用するように修正する。

app/views/store/_cart.html.erb

<%= button_to "Checkout", { :action => "checkout" }, { :disabled => !@order.nil? } %>
  ↓のように変更する
<%= button_to "Checkout", { :action => "checkout" }, { :method => :get, :disabled => !@order.nil? } %>
RailsによるアジャイルWebアプリケーション開発
Sam Ruby David Heinemeier Hansson Dave Thomas
オーム社
売り上げランキング: 29946
«
»