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

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

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

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

Q&A

解決済

1回答

1968閲覧

railsでのツイッターのようなサービスを作るにあたって

daidaidai

総合スコア19

Ruby on Rails

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

0グッド

0クリップ

投稿2015/08/06 23:43

現在ツイッターのようなサービスを作成しようと思っているのですが、タイムラインの設計に困っているのでもしわかる方がいらしたら教えてください。

私が作りたいサービスは、例えばダイエット専門snsと仮定した場合、ツイートを3種類に分け、日々の進捗(主に体の画像など)、食事メニュー、トレーニングメニューを三種類のmodelに分けて作っています。日々の進捗=dailymodel,食事メニュー=foodmodel,トレーニングメニュー=trainingmodel

それを各々インスタンス化しタイムライン(timeline#index)にrenderで流そうと思っているのですが、このような作り方した場合フォロワーのツイートを流す時に_daily.html.erbと_follower_daily.html.erbの二種類のviewが必要となってしまいます。
つまり3(modelの数)×2(フォロワー分)=6個のviewを作成しなければならないのでしょうか?

作成することは可能なのですが、あまりにも多くのviewを作らないといけなくなってしまうので、どなたか簡単にできる方法をご存知ならば教えてください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

私なら、ツイートのモデルのdailymodel,foodmodel,trainingmodelの上位にtweetモデルでも作って、投稿者の情報をそこに集約します。
その上で、Viewのほうでは、render: :partialをうまいこと使って、出来るだけDRYに書くようにします。

Ruby

1class Author < ActiveRecord::Base 2 has_many :tweets 3 has_many :follower_relations 4 has_many :followers through: :follower_relations, source: :author_id 5 6 def visible_authors 7 authors = self.followers 8 authros << self 9 return authors 10 end 11end 12 13class Tweet < ActiveRecrd::Base 14 belongs_to :author 15 has_one :daily 16 has_one :food 17 has_one :training 18 validate :any_content_must_exist 19 20 def any_content_must_exist 21 unless self.daily || self.food || self.training 22 self.errors.add(:base, "daily, food, trainingのいずれかが無ければなりません") 23 end 24 end 25 # tweetに入れられるコンテンツは一つだけ 26 def daily=(dailymodel) 27 self.food = nil 28 self.training = nil 29 end 30 # food,trainingも同様にする 31end 32 33class TweetController < ApplicationController 34 def index 35 tweet_table = Tweet.arel_table 36 @tweets = tweet_table.includes([:author, :daily, :food, :training]).where(tweet_table[:author_id].in(@current_author.visible_authors.map{|a|a.id}).order(tweet_table[:tweet_at].desc).all 37 end 38end

html

1<!-- index.html.erb --> 2<% @tweets.each do |tweet| %> 3 <%= render partial: 'author_column', locals: {author: tweet.author} %> 4 <!-- tweetで共通の表示項目をここに表示 --> 5 <% if tweet.daily %> 6 <%= render partial: 'daily', locals: {daily: tweet.daily} %> 7 <% elsif tweet.food %> 8 <%= render partial: 'food', locals: {daily: tweet.food} %> 9 <% else %> 10 <%= render partial: 'training', locals: {daily: tweet.training} %> 11 <% end %> 12<% end %>

partialのテンプレートは省略
partialで表示するテンプレートは全部共通なので、Viewをたくさん書かなくてもいいです。

結構適当に書いたので動かないですが、雰囲気だけでも。

投稿2015/08/07 02:42

rifuch

総合スコア1901

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

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

daidaidai

2015/08/07 12:03

懇切丁寧にありがとうございます。非常にわかりやすいです!ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問