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

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

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

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

Q&A

解決済

1回答

244閲覧

【Rails】現状の冗長コードをもっとスマートに書き直したい

ta539tg70

総合スコア20

Ruby on Rails 5

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

0グッド

1クリップ

投稿2018/12/02 04:50

編集2018/12/02 04:52

Rails5を使ってアプリを作っています。
下記のようなboolean型のカラムを4つ持つテーブルがあり、その中身をそれぞれ判定してtrueだった時のみ個別のメッセージを表示させる、ということをしたいと思っています。

ruby

1class CreatePosts < ActiveRecord::Migration[5.2] 2 def change 3 create_table :posts do |t| 4 t.integer :user_id, null: false, default: 0 5 t.string :title, null: false, default: '' 6 t.text :description, null: true 7 t.boolean :status_1, null: false, default: false 8 t.boolean :status_2, null: false, default: false 9 t.boolean :status_3, null: false, default: false 10 t.boolean :status_4, null: false, default: false 11 12 t.timestamps 13 end 14 end

現状のコードが下記の通りです。

ruby

1# posts_controller.rb 2 3def index 4 @posts = Post.all 5end

erb

1<%# index.html.erb %> 2 3<% @posts.each do |post| %> 4 <ul> 5 <% if post.status_1 %> 6 <li>A</li> 7 <% end %> 8 <% if post.status_2 %> 9 <li>B</li> 10 <% end %> 11 <% if post.status_3 %> 12 <li>C</li> 13 <% end %> 14 <% if post.status_4 %> 15 <li>D</li> 16 <% end %> 17 <% if !post.status_1 && !post.status_2 && !post.status_3 && !post.status_4 %> 18 <li>NONE</li> 19 <% end %> 20 </ul> 21<% end %>

このように、例えばstatus_1だけがtrueならば「A」のみが表示されて、status_2status_4trueなら「B」と「D」が表示されるイメージです。
現状のコードで特にエラーもなく期待通りの結果が得られてはいるのですが、明らかに冗長な書き方なので、どうにかもう少しスマートに記述ができないものか...と思っているところです。コードをご覧いただいてお分かりの通り、当方まだまだ初心者でして、なにか良いアイディアがございましたらご教示いただけますと幸いです。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

gem draper を使い関数化する案があります

関数化だけなら ApplicationHelper 等に定義することもできますが(書き方は若干違う)
特定の Model に依存した描画用関数なら、共通の Helper より個別の draper を使うほうがスッキリします

ruby

1class PostDecorator < Draper::Decorator 2 def status_1_tag 3 return unless object.status_1 4 h.content_tag(:li, 'A') 5 end 6 7 # 略 8 9 def status_none_tag 10 return unless status_none? 11 h.content_tag(:li, 'NONE') 12 end 13 14 private 15 16 # これは表示と関係なく Post だけで閉じているので Post クラス側に定義しても良い 17 def status_none? 18 !object.status_1 && !object.status_2 && !object.status_3 && !object.status_4 19 end 20end

erb

1<% @posts.decorate.each do |post| %> 2 <ul> 3 <%= post.status_1_tag %> 4 <%= post.status_2_tag %> 5 <%= post.status_3_tag %> 6 <%= post.status_4_tag %> 7 <%= post.status_none_tag %> 8 </ul> 9<% end %>

投稿2018/12/02 23:44

Ighrs

総合スコア656

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

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

ta539tg70

2018/12/04 00:34

そんな素敵なgemがあったのですね!そもそもhelperを使うという概念が自分の中にありませんでした。なるほど...。参考にさせていただきます、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問