次のようなCampaign#showアクションがあるとします。
def show
@campaign = Campaign.find(params[:id])
end
YouTube APIから取得し、変数で記述した情報をビューに表示したいので、Campaign#showは次のようになります。
def show
@campaign = Campaign.find(params[:id])
@views = Campaign.youtube_info(@campaign.url) # this class method of Campaign
end
しかし、便宜上、@ campaignと@viewsをマージして、@ campaignにこの@campaign [:views] [:view_count]のようなものを入れたいと思います。
私が理解したように、@ campaingはActiveRecordオブジェクトであり、@ viewsはハッシュであり、そのようなマージを行うことは許可されていません。
この状況での最善のアプローチは何ですか?
前もって感謝します。
まず、通常のRailsアプリの一部として、任意の数のオブジェクトをビューに渡します。使用して、すべての何も間違ってあります@views
とは@campaign
。
しかし、あなたの場合、物事は非常に奇妙に書かれています。
1つはviews
、のメソッドである必要があり、をCampaign
呼び出すだけyoutube_info
です。
youtube_info
クラスのインスタンスからプロパティを入力する必要があるため、クラスレベルのメソッドであるのは奇妙です。これはインスタンスメソッドである必要があり、ビューでそのメソッドを呼び出すだけです。
呼び出しごとにAPIへの追加の呼び出しを防ぎたい場合は、最初の呼び出しの結果をキャッシュします。メソッドの戻り値を「キャッシュ」するプロセスはメモ化と呼ばれ、Rubyの世界で多くのことが書かれています。以下は、Rubyで非常に一般的なパターンです。
class Campaign < ActiveRecord::Base
def youtube_info
@youtube_info ||= perform_some_api_request(@url)
end
def views
youtube_info['views']
end
end
メソッドは、最初に実行されたときにyoutube_info
のみメソッドを呼び出しperform_some_api_request
ます。結果はに割り当てられてから@youtube_info
返されます。後続の各呼び出しは@youtube_info
、偽以外の値に設定されている場合、テストして返します。への各呼び出しviews
は単にを呼び出しyoutube_info
、最初の呼び出しのみがAPI呼び出しを実行します。
同じ手法を使用して、コードを記述したままにして、代わりにクラスレベルのメソッドを呼び出すこともできますが、お勧めしません。
class Campaign < ActiveRecord::Base
def self.youtube_info(url)
# ...
end
def views
@views ||= Campaign.youtube_info(@url)['views']
end
end
しかし、最初の例の方が優れています。youtube_info
クラスレベルのメソッドになる理由は実際にはありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加