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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

194閲覧

このコードはリファクタリングできますか?

kkk11

総合スコア23

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

2クリップ

投稿2019/04/07 10:01

前提・実現したいこと

8割同じ様なコードなのにリファクタリングができないのが惜しいです。
以下の様なアプリを作っていて、

「全投稿」では名前の通り全部の投稿を表示しています。
「指導者の投稿」では下記にある様にteacher/indexで、指導者だけの投稿を表示
「受講者の投稿」も下記の様にstudent/indexで、受講者だけの投稿を表示したいのですが、それぞれコードはほぼ同じなのにrecruitmentやstudent、teacherという文字があるために上手くリファクタリングできません。

そもそもこの状態はリファクタリングが出来るのか教えていただきたいです。

作成中のアプリ

該当のソースコード

recruitment/index.html

<% recruitments.each do |recruitment| %> <div class="each-p"> <div class="p-upper"> <div class="p-user"> <p> <%= image_tag("user.png", :alt => "募集者の画像", :class => "user-pic") %> </p> <div class="user-name"> <p><%= recruitment.user.name %></p> </div> <div class="user-pref"> <p><%= recruitment.user.prefecture %></p> </div> </div> <div class="p-title"> <h2><%= truncate(recruitment.title, length: 20) %></h2> </div> </div> <div class="p-content"> <%= link_to recruitment_path(recruitment), class: "link" do %> <p> <%= truncate(recruitment.content, length: 35) %> </p> <% end %> </div> <div class="p-tag"> <span> <%= fa_icon 'clock' %> 希望日: <%= recruitment.hope_day %> </span> <span> <%= fa_icon 'tag' %> <%= recruitment.categories.name %> </span> </div> </div> <% end %>

teacher/index.html

<% teachers.each do |teacher| %> <% teacher.recruitments.each do |recruitment| %> <div class="each-p"> <div class="p-upper"> <div class="p-user"> <p> <%= image_tag("user.png", :alt => "募集者の画像", :class => "user-pic") %> </p> <div class="user-name"> <p><%= teacher.name %></p> </div> <div class="user-pref"> <p><%= teacher.prefecture %></p> </div> </div> <div class="p-title"> <h2><%= truncate(recruitment.title, length: 20) %></h2> </div> </div> <div class="p-content"> <%= link_to recruitment_path(recruitment), class: "link" do %> <p> <%= truncate(recruitment.content, length: 35) %> </p> <% end %> </div> <div class="p-tag"> <span> <%= fa_icon 'clock' %> 希望日: <%= recruitment.hope_day %> </span> <span> <%= fa_icon 'tag' %> <%= recruitment.categories.name %> </span> </div> </div> <% end %> <% end %>

student/index.html

<% students.each do |student| %> <% student.recruitments.each do |recruitment| %> <div class="each-p"> <div class="p-upper"> <div class="p-user"> <p> <%= image_tag("user.png", :alt => "募集者の画像", :class => "user-pic") %> </p> <div class="user-name"> <p><%= student.name %></p> </div> <div class="user-pref"> <p><%= student.prefecture %></p> </div> </div> <div class="p-title"> <h2><%= truncate(recruitment.title, length: 20) %></h2> </div> </div> <div class="p-content"> <%= link_to recruitment_path(recruitment), class: "link" do %> <p> <%= truncate(recruitment.content, length: 35) %> </p> <% end %> </div> <div class="p-tag"> <span> <%= fa_icon 'clock' %> 希望日: <%= recruitment.hope_day %> </span> <span> <%= fa_icon 'tag' %> <%= recruitment.categories.name %> </span> </div> </div> <% end %> <% end %>
DrqYuto👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

ちがうぶぶんだけ変数にしたパーシャルビューにしてわたしてあげるだけでいいんじゃ

_post.html.erb

<div class="each-p"> <div class="p-upper"> <div class="p-user"> <p> <%= image_tag("user.png", :alt => "募集者の画像", :class => "user-pic") %> </p> <div class="user-name"> <p><%= user.name %></p> </div> <div class="user-pref"> <p><%= user.prefecture %></p> </div> </div> <div class="p-title"> <h2><%= truncate(recruitment.title, length: 20) %></h2> </div> </div> <div class="p-content"> <%= link_to recruitment_path(recruitment), class: "link" do %> <p> <%= truncate(recruitment.content, length: 35) %> </p> <% end %> </div> <div class="p-tag"> <span> <%= fa_icon 'clock' %> 希望日: <%= recruitment.hope_day %> </span> <span> <%= fa_icon 'tag' %> <%= recruitment.categories.name %> </span> </div> </div>

recruitment/index.html

<% recruitments.each do |recruitment| %> <%= render 'post', recruitment: recruitment, user: recruitment.user %> <% end %>

teacher/index.html

<% teachers.each do |teacher| %> <% teacher.recruitments.each do |recruitment| %> <%= render 'post', recruitment: recruitment, user: teacher %> <% end %> <% end %>

投稿2019/04/07 10:57

編集2019/04/07 10:58
mypt

総合スコア170

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

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

kkk11

2019/04/07 13:06

ありがとうございます。 教えていただいた通りにすればエラーなくできますが、recruitmentの数だけrenderされるのですがそれは仕方のないことなのですか?
mypt

2019/04/07 13:09 編集

仕方がないというか同じ部分のコードを3回呼び出しているメソッド呼び出しのようなもので それこそがリファクタリングの成果だと思います render されるのが嫌なら全部を helper method にすることもできなくはないですが…
kkk11

2019/04/07 13:12

renderが何回もされることによって影響は何かありますか?
mypt

2019/04/07 13:20

当然いろいろな影響はあります パフォーマンス面ではデメリットになりますが メンテナンス性はあがるかと思います
kkk11

2019/04/07 13:27

ありがとうございます。 頂いた回答を元にまた試行錯誤してみます!
退会済みユーザー

退会済みユーザー

2019/04/08 04:27

加えるなら、例えばここ <% teachers.each do |teacher| %> <% teacher.recruitments.each do |recruitment| %> でN+1問題が発生しています。 こういった箇所も直せばパフォーマンス面の改善につながると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問