Rails控制器重构

时间:2013-06-11 04:29:09

标签: ruby-on-rails refactoring

我的代码类似于follwoing

...
@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
...

现在所有的实例变量都将在视图中使用,我想重新分解代码以使Controller变细。什么是进行重新分解的最佳方法?将此代码移至模型是否明智?

2 个答案:

答案 0 :(得分: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

有关view helpers

的更多信息

答案 1 :(得分:0)

我会使用Presenter模式,这里有一些资源可供解释(还有更多资源):

  1. http://blog.jayfields.com/2007/03/rails-presenter-pattern.html
  2. http://kpumuk.info/ruby-on-rails/simplifying-your-ruby-on-rails-code
  3. 简短的故事:您将所有用于检索模型的逻辑放在演示者中。演示者易于测试和扩展。在您的控制器中,操作将只有一行代码来实例化演示者。