質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

952閲覧

パーシャルの設計について相談したいです

pecchan

総合スコア592

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/09/02 14:08

編集2020/09/02 22:38

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

no1knows

2020/09/02 21:50

<!--ここに画像登録の処理を差し込みたい --> <!--だが、newとeditで処理が異なる --> このコードをご提示ください。
pecchan

2020/09/02 22:38

大変失礼しました。 追記致しました。
guest

回答1

0

ベストアンサー

パターン2._formの中でif文でnewかedit分岐し両方の処理を書く
→newとeditで共通利用するため作ったのに本末転倒な。。。

僕ならこのパターンを採用します。

理由としては後から見直したときや他の方が見たときに、ほぼ同じ処理をしていると直感的にわかるのはメリットだと思います。
また今回の場合であれば条件分岐は1回のみにして可読性を優先する形で実装します。

Hamlの書き方がわからないので、インデントは適宜修正ください。

haml

12.form-image__text 最大10枚までアップロードできます 3.clearfix  4 5-if controller.action_name == 'new' 6 7= f.fields_for :images do |image| 89= image.file_field :name, class: "hidden image_upload" 10 11-else 12 13%ul#previews 1415.image-preview_btn_delete 削除 16

投稿2020/09/02 23:19

no1knows

総合スコア3365

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pecchan

2020/09/03 01:06

有難う御座います! この程度の違いであれば、ありですよね?! 参考になりました。パターン2でいきます(^^)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問