【发布时间】:2012-07-02 12:05:13
【问题描述】:
我有这个创建方法:
def create
...
grid = Tag.find_by_id(story[:tag_id]) or raise GridNotFoundError
...
event = Event.find_by_id(story[:event_id]) or raise EventNotFoundError
...
rescue GridNotFoundError
flash.now[:error] = "Please select a category"
@item = item
@years = story[:years]
@event_name = race[:name]
@country = race[:country]
@classification = race[:class]
@events = Event.all
@countries = Tag.countries
@classifications = Classification.all
@grids = Tag.grids.find(:all, :conditions => ["value != ?", "Channel Creation Grid"])
render "home/race_updates"
rescue EventNotFoundError
flash.now[:error] = "Please select an event or create a new one if you don't find your event"
@item = item
@event = story[:event_id]
@years = story[:years]
@events = Event.all
@countries = Tag.countries
@classifications = Classification.all
@grids = Tag.grids.find(:all, :conditions => ["value != ?", "Channel Creation Grid"])
render "home/race_updates"
rescue CreateEventError
flash.now[:error] = "There has been a problem creating your event."
params[:expand] = true
@item = item
@years = story[:years]
@event_name = race[:name]
@country = race[:country]
@classification = race[:class]
@events = Event.all
@countries = Tag.countries
@classifications = Classification.all
@grids = Tag.grids.find(:all, :conditions => ["value != ?", "Channel Creation Grid"])
render "home/race_updates"
rescue ActiveRecord::RecordNotSaved, ActiveRecord::RecordInvalid, ActiveRecord::RecordNotFound
flash.now[:error] = item.errors.full_messages.join(" ,")
@item = item
@event = story[:event_id]
@years = story[:years]
@events = Event.all
@countries = Tag.countries
@classifications = Classification.all
@grids = Tag.grids.find(:all, :conditions => ["value != ?", "Channel Creation Grid"])
render "home/race_updates"
end
如您所见,救援几乎相同。救援也是 home#race_updates 方法的字面复制粘贴。
我有 2 个问题:
- 我有什么办法可以把它擦干吗?
- 这对于一般的控制器来说是一个好的模式吗?
我曾考虑将它作为一个函数分离出来,但我需要传入 Flash 消息、项目、故事和比赛变量。我觉得这不是一个优雅的解决方案,但它肯定会更干净。
我发现以这种方式编码(即引发错误并拯救它们)使我更容易分离实际的业务逻辑,并处理业务逻辑中出现的不同错误/情况。到目前为止,它有效,但我想就这是否是最佳做法或我没有按预期使用 begin/rescue 收集意见?
【问题讨论】:
-
您需要
raise做什么?它可以通过正常的流控制(if,case)加上将分支逻辑分离成更小的方法来完成。raise用于异常,而不用于流控制。 -
@Victor:你会如何在网络应用的上下文中使用 raise?
-
我根本不会使用
raise,它可能在极少数情况下可以用于深度嵌套的方法。 -
@Victor:我发现使用普通流控制 (
if,case) 处理错误很快就会变得笨拙。或者这是否意味着我应该重构它?
标签: ruby-on-rails ruby design-patterns