0

次のようなコードがあります

...
@c = M.find(params[:id]).c.find(params[:c_id])
if @c.s.count > 0
  @s = @c.s.sort_by{|e| e[:order]}.first
  unless @s.p.nil?
    @img = @s.p.image_file.remote_url
  else
    @s.p = P.new
    @img = request.protocol + request.host_with_port + "/none.png"  
  end
  unless @s.a.nil?
    @voice = @s.a.audio_file.remote_url
  else
    @s.a = A.new
  end
else
 ...  
end
@c_v_url = ""
unless @c_v_url.nil?
  @c_v_url = @c.v_o.a_file.remote_url
else
  @c.v_o = A.new
end  
@c_m_url = ""
unless @c_m_url.nil?
  @c_m_url = @c.b_m.a_file.remote_url
else
  @c.b_m = A.new
end
...

これで、すべてのインスタンス変数がビューで使用されるようになりました。コードをリファクタリングしてコントローラーを細くしたいと思います。リファクタリングを行うための最良のアプローチは何ですか? このコードをモデルに移動するのは賢明でしょうか?

4

2 に答える 2

1

このコードが何に使われているのかよくわかりませんが、画像、ファイル、オーディオ リンクを表示するビュー ロジックのように見えますか?

たとえば、次のように、それぞれにビュー ヘルパー メソッドを作成します。

 def s_image_url(s)
   unless s.p.nil?
     s.p.image_file.remote_url
   else
     request.protocol + request.host_with_port + "/none.png"  
   end
 end

ビュー ヘルパーの詳細については、

于 2013-06-11T05:18:07.727 に答える
0

私はプレゼンター パターンを使用します。ここに説明用のリソースがいくつかあります (他にもたくさんあります)。

  1. http://blog.jayfields.com/2007/03/rails-presenter-pattern.html
  2. http://kpumuk.info/ruby-on-rails/simplifying-your-ruby-on-rails-code

短編小説: モデルを取得するためのすべてのロジックをプレゼンターに配置します。プレゼンターは簡単にテストでき、拡張可能です。コントローラー アクションには、プレゼンターをインスタンス化するためのコードが 1 行しかありません。

于 2013-06-11T06:04:17.343 に答える