rails5.2です。
商品(item)モデルの登録と更新に関して、パーシャル化し両方から同じものを使うようにしてました。
画像も必要になり、画像の登録と更新でロジックが分かれるため、ここからどう分割して良いか分からなくなりました。
実装方法を考えた挙げ句、以下の2パターンしか思いつきませんでした。
パターン1.もうパーシャルを使わない
→画像登録以外は、ダブってしまいます。。。
パターン2._formの中でif文でnewかedit分岐し両方の処理を書く
→newとeditで共通利用するため作ったのに本末転倒な。。。
いずれもイマイチです(泣)
このような時はどのようにするのがベストでしょうか?
諸先輩方アドバイス宜しくお願い致します。
/app/views/items/new.html.erb
ruby
1% provide(:title, (t '.title')) %> 2<% provide(:button_text, '登録') %> 3<% provide(:path, items_path) %> 4 5 6<h1><%= t '.title' %></h1> 7 8<div class="row"> 9 <div class="col-md-6 col-md-offset-3"> 10 <%= render partial: 'form', locals: { item: @item } %> 11 </div> 12</div> 13 14
/app/views/items/edit.html.erb
ruby
1<% provide(:title, (t '.title')) %> 2<% provide(:button_text, '更新') %> 3<% provide(:path, item_path(@item.id)) %> 4 5 6<h1><%= t '.title' %></h1> 7 8<div class="row"> 9 <div class="col-md-6 col-md-offset-3"> 10 <%= render partial: 'form', locals: { item: @item } %> 11 </div> 12</div> 13 14
/app/views/items/_form.html.erb
ruby
1 2 <%= form_for(@item, url: yield(:path)) do |f| %> 3 <%= render 'shared/error_messages', obj: @item %> 4 5 <%= f.hidden_field :user_id, :value => @item.user_id %> 6 7 <%= f.label :images %> <%= label_tag(:images, "(任意)", class: 'optional_field') %> 8 <div class="form-image_text">10枚まで追加できます</div> 9 10 11 12 <!--ここに画像登録の処理を差し込みたい --> 13 <!--だが、newとeditで処理が異なる --> 14 15 16 <%= f.label :title %> <%= label_tag(:title, "(必須)", class: 'required_field') %> 17 <%= f.text_field :title, class: 'form-control' %> 18 19 <%= f.label :description %> <%= label_tag(:description, "(必須)", class: 'required_field') %> 20 <%= f.text_area :description, class: 'form-control' %> 21 22 23 <% category_options = Category.order(:id).map { |c| [c.name, c.id, data: { children_path: category_sub_categories_path(c) }] } %> 24 <%= f.label :category_id %> <%= label_tag(:category, "(必須)", class: 'required_field') %> 25 <%= f.select :category_id, category_options, {include_blank: "選択して下さい"}, {class: 'select-parent form-control'} %> 26 27 <% sub_categories = @item.category.try(:sub_categories) || [] %> 28 <% sub_category_options = sub_categories.map { |c| [c.name, c.id] } %> 29 <%= f.select :sub_category_id, sub_category_options, {include_blank: "選択して下さい"}, {class: 'select-children form-control'} %> 30 31%> 32 33 34 <!--実際は他に登録するカラムあるが今回は省略。。。 --> 35 36 <%= f.submit yield(:button_text), class: "btn btn-primary", id: "commit" %> 37 <% end %> 38 39 40
※画像登録部分を追記
登録
haml
1.new-product 2 =render "./registrations/sub-header" 3 .main 4 .head 5 %h2 商品の情報を入力 6 = form_with model: @product, class: "form", id: "product-form" do |f| 7 .form-image 8 .form-image__title 9 %label 出品画像 10 %span 必須 11 .form-image__text 最大10枚までアップロードできます 12 = f.fields_for :images do |image| 13 .clearfix 14 // 写真のプレビューとインプットボタンのul 15 %ul#previews 16 %li.input 17 // 画像を取り込むインプットボタン 18 %label.upload-label 19 .upload-label__text 20 ドラッグアンドドロップ 21 %br 22 またはクリックしてファイルをアップロード 23 .input-area 24 = image.file_field :name, class: "hidden image_upload"
更新
haml
1.new-product 2 =render "./registrations/sub-header" 3 .main 4 .head 5 %h2 商品の情報を入力 6 = form_with model: @product, class: "form", id: "product-form-edit" do |f| 7 .form-image 8 .form-image__title 9 %label 出品画像 10 %span 必須 11 .form-image__text 最大10枚までアップロードできます 12 .clearfix 13 %ul#previews 14 = f.fields_for :image do |image| 15 - @product.images.each_with_index do |img, i| 16 %li.image-preview 17 %label.upload-label{style:"display: none;"} 18 .upload-label__text 19 ドラッグアンドドロップ 20 %br 21 またはクリックしてファイルをアップロード 22 .input-area 23 = image.file_field :name, value: img.name ,class: "hidden image_upload" 24 = image.hidden_field :id, value: img.id, name:"product[image][#{i}]" 25 .image-preview__wapper 26 = image_tag img.name.to_s, class:"preview" 27 .image-preview_btn 28 .image-preview_btn_edit 編集 29 .image-preview_btn_delete 削除 30
回答1件
あなたの回答
tips
プレビュー