我正在寻找更好的方法来保持我的控制器清洁和可读。看看这个控制器动作:
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]和翻译。
你认为这可以用更好,干燥和更易读的方式来完成吗?
答案 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
。这有帮助吗?