使控制器代码在轨道中干燥

时间:2015-09-03 18:15:43

标签: ruby-on-rails

我有两个控制器有更新操作。这两个动作都有类似的代码,我很困惑如何删除重复并使其干燥。代码气候显示这一重复问题。以下是详细信息。

Controller 1:
respond_to do |format|
  if @business_profile.update(business_profiles_params)
    format.html { redirect_to settings_path, notice: t('setting_successful_message') }
  else
    format.html { redirect_to settings_path, alert: t('setting_failure_message')
  end
end
Controller 2:
respond_to do |format|
  if @contact.update(contact_params)
    format.html { redirect_to contacts_path, notice: t('contact_successful_message') }
  else
    format.html { redirect_to contacts_path, alert: t('contact_failure_message')
  end
end

所以我希望这个类似的内容合二为一。

2 个答案:

答案 0 :(得分:1)

他们都缺少end块的if,第一个可能在stting_failure_message中有拼写错误。两者都在}块中缺少右大括号(else)。可能会有更微妙的问题。

获取代码并运行控制器测试,然后再担心提取共享方法以从两个控制器更新方法调用的优化。对于它的价值,当前的重复程度看起来对我来说是正确的,在本地清晰的表达和变化的独立性与抽象的重复代码权衡。请查看这些问题,以获得有关干燥控制器最佳实践的更一般性讨论:Best Practices for reusing code between controllers in Ruby on Rails

这一项中评分最高的答案是您正在考虑的提取的成本/收益

DRY Controllers in Rails 3.2

答案 1 :(得分:0)

如果您计划使用Flash消息进行响应并经常重定向到索引操作,请检查响应者 gem,特别是FlashResponder(https://github.com/plataformatec/responders#flashresponder)和CollectionResponder(https://github.com/plataformatec/responders#collectionresponder)。