如何在控制器中干燥重复的代码

时间:2014-11-30 15:49:53

标签: ruby-on-rails ruby-on-rails-4

状态控制器

respond_to do |format|
   format.html
   format.js
   if @status.present? && @status.valid?
      format.json { render json: @status.to_json }
   else
      format.json { render json: @status.errors.values.join(",") }
   end     

另一个控制器具有相同的上述代码只需更改@status。

我正在使用Code Climate,因为我正在重复代码警告。

那么如何优化代码?

提前致谢

2 个答案:

答案 0 :(得分:2)

您可以在父控制器(或ApplicationController)中添加方法,例如:

def render_valid_resource format, resource
  if resource.present? && resource.valid?
    format.json { render json: resource.to_json }
  else
    format.json { render json: resource.errors.values.join(",") }
  end
end

然后只需致电render_valid_resource format, @status

顺便说一句,如果你发现自己有更多相似的案例,你可以使用像https://github.com/plataformatec/responders

这样的宝石来研究一种更有条理的方法。

答案 1 :(得分:1)

例如如下:

json =
if @status.present? && @status.valid?
   @status.to_json
else
   @status.errors.values.join(",")
end
format.json { render json: json }

或单行:

json = @status.present? && @status.valid? && @status.to_json || @status.errors.values.join(",")
format.json { render json: json }