Railsのcheck_boxのリストの1つの応用



面接で出会った質問は、製品リストの前にcheckを追加します.boxは、1つまたは複数の製品を選択し、コミット後にcheckoutページに移動し、emailやaddressなどの顧客情報を入力した後、保存をコミットします.
 
最初の考え方:
各productのidをcheckに転送するboxは、コミット後にparamsから選択したid値を取得し、データベースからid値に基づいてcheckoutページに対応するproductの情報をリストします.
まず:check_boxに光がid値に入るだけでは足りないので、このcheck_をあげます.boxに名前を付ける
次に、コミットはlink_を使用します.to,link_toもパラメータを受け入れることができますが、どのように複数のidをパラメータとしてこのlink_にあげますか?to
したがって,処理のactionでは選択した製品のid値が得られない.
 
変更後:
check_boxのname=「product[]」,value=「<%=product.id%」」
そしてform_に置きますtagではなくlink_to、これでコミットすると、選択したidがparamsに表示されます.
しかしactionでこのように検索すると、次のようになります.
Product.find(:all, :conditions => ["id = ?", params[:product]] )

このようなエラーが発生します.
Operand should contain 1 column(s): SELECT * FROM `products`     WHERE (id = '1','3') 

すでに選ばれた製品のIDが入っているようですが、どうやって取り出しますか?IDが得られた以上、一つ一つ反復して配列に追加します.
@products = []
    params[:product].each do |p|
      @products << Product.find_by_id(p)
    end

これにより、@productsに基づいて選択したproductを次のページで反復できます.
ここのcheckboxはrailsで提供されているラベルを使っていないので、railsのラベルが便利かもしれませんが、次回試してみてください.
 
 
sacffoldでproductを作成しました:
ruby script/generate scaffold product name:string price:decimal desc:string owner:string

form_を使うならtag:
<% form_tag checkout_products_path, :method => :put do %>

まだroutesにいるrb構成パス:
map.resources :products, :collection => {:checkout => :put}

indexでhtml.Erbページには、すべての製品がリストされます.
 
<h1>Listing products</h1>
<%= link_to '     ', new_product_path %><br>
<%= flash[:notice] %>
<% form_tag checkout_products_path, :method => :put do %>
<table>
  <tr>
    <th colspan="2">Name</th>
    <th>Price</th>
    <th>Desc</th>
    <th>Owner</th>
  </tr>
<% for product in @products %>
  <tr>
    <td>
      <input name="id" value="<%= product.id %>" type="checkbox" />
      <%= check_box_tag "product[]", product.id,false %>
    </td>
    <td><%=h product.name %></td>
    <td><%=h product.price %></td>
    <td><%=h product.desc %></td>
    <td><%=h product.owner %></td>
    <td><%= link_to 'Show', product %></td>
    <td><%= link_to 'Edit', :controller => :products, :action => :edit, :id => product %></td>
    <td><%= link_to 'Destroy', product, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>
</table>
<%= submit_tag "    " %>
<% end %>

 
実はform_も使えますfor:
<% form_for :product, :url => {:action => :checkout} do |f| %>

これによりroutesを構成する必要はありません.
map.resources :products