这是干燥的好方法吗?

时间:2011-04-17 02:07:06

标签: ruby-on-rails ruby

我的控制器操作如下:

# check if user is already working
if current_user.working?
  flash[:error] = I18n.translate 'error.working'    
  redirect_to labor_url and return          
end

# check if user is doing a quest
if current_user.has_tavern_quest?
  flash[:error] = I18n.translate 'error.has_quest'      
  redirect_to labor_url and return          
end

现在,这是一些似乎在其他控制器及其动作中重复的代码。因此,我认为干一点东西是个好主意。我想过创建一个用户方法,如:

def is?(states)
    possible_states = :working, :doing_tavern_quest
    # check states
    # set flash messages, do the same things as above without the redirects
end

我的想法是,我现在只是在我的行动中使用类似的东西:

redirect_to labor_url if current_user.is?(:working, :doing_tavern_quest)

你认为这是个好主意吗?这是干燥事情的好方法还是我能以更好的方式做到这一点?

2 个答案:

答案 0 :(得分:1)

我喜欢并返回模式。

但除非有很多不同的动态条件,为什么不尽可能地将用户状态封装在模型中呢?

除非控制器需要知道细节,否则如何:

redirect_to labor_url if current_user.busy? # no parameters
顺便说一下,控制器方法不会返回任何内容,你可能会这样做:

return redirect_to labor_url if current_user.busy?

答案 1 :(得分:1)

原则上使用current_user.is?(state)没有错,除了名字(is_one_of?...)

def is?(states)
    possible_states = [:working, :doing_tavern_quest] # note square brackets here
    # check states
    # set flash messages, do the same things as above without the redirects
end

您可以在重定向行中提取方法并在ApplicationController类中创建一个方法,以便代码更干燥(如果重定向到同一个地方。)