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