最好的方法来干燥并更好地澄清代码

时间:2011-04-17 07:56:25

标签: ruby-on-rails

我正在寻找更好的方法来保持我的控制器清洁和可读。看看这个控制器动作:

  def start
    @work_hours = params[:work_hours].to_i

    redirect_to labor_url, :flash => {:error => I18n.t('error.invalid_post')} and return unless (1..8).include? @work_hours
    redirect_to labor_url, :flash => {:error => I18n.t('error.working')} and return if current_user.working?
    redirect_to labor_url, :flash => {:error => I18n.t('error.has_quest')} and return if current_user.has_tavern_quest?

    redirect_to labor_path 
  end

正如您所看到的,如果情况发生,这些都在做同样的事情。他们正在设置flash消息并重定向到url(并返回)。虽然这在澄清方面对我来说似乎没问题,但我不禁注意到重定向中的一些重复,我不喜欢用如此难看的方式设置flash [:error]和翻译。

你认为这可以用更好,干燥和更易读的方式来完成吗?

1 个答案:

答案 0 :(得分:1)

所有重定向的url都是相同的(如果我看到正确,url和path之间没有区别),所以我会重构如下:

def start
  @work_hours = params[:work_hours].to_i

  flash[:error] = I18n.t('error.invalid_post') unless (1..8).include? @work_hours
  flash[:error] = I18n.t('error.working') if current_user.working?
  flash[:error] = I18n.t('error.has_quest') if current_user.has_tavern_quest?

  redirect_to labor_path 
end

所以:如果需要,设置闪存,并在所有情况下重定向到labor_path。这有帮助吗?

如果出现错误,您需要重定向到其他内容,请执行以下操作:

def start
  @work_hours = params[:work_hours].to_i

  flash[:error] = I18n.t('error.invalid_post') unless (1..8).include? @work_hours
  flash[:error] = I18n.t('error.working') if current_user.working?
  flash[:error] = I18n.t('error.has_quest') if current_user.has_tavern_quest?

  redirect_to labor_error_path and return if flash[:error]
  redirect_to labor_path 
end

如果条件不相互排斥,我会这样写:

def start
  @work_hours = params[:work_hours].to_i

  flash[:error] = unless (1..8).include? @work_hours 
    I18n.t('error.invalid_post') 
  elsif current_user.working?
    I18n.t('error.working')
  elsif current_user.has_tavern_quest?
    I18n.t('error.has_quest') 
  else
    nil
  end

  redirect_to labor_error_path and return if flash[:error]
  redirect_to labor_path 
end

我不完全确定是否明确需要else nil。这有帮助吗?