我的控制器操作如下:
# 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)
你认为这是个好主意吗?这是干燥事情的好方法还是我能以更好的方式做到这一点?
答案 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类中创建一个方法,以便代码更干燥(如果重定向到同一个地方。)