【发布时间】:2013-12-21 17:55:53
【问题描述】:
我有一个带有很多重定向条件的长控制器方法:
def show
get_param_user
if params[:id].match(/\D/)
@document = Document.where(:user_id => @user.id, :issue => params[:id]).first
else
@document = Document.find(params[:id])
end
unless @document.blank?
unless @document.template.name == "Media"
unless @document.retired?
@creator = User.find(@document.user)
if @creator == @user # if document exists, based on name and id
@document.components.each do |a|
redirect_to share_error_url, :flash => { :error => "#{@document.title} contains retired content and is now unavailable." } if a.retired? and return
end
render @document.template.name.downcase.parameterize.underscore
end
else # if retired
redirect_to share_error_url, :flash => { :error => "That document has expired." } and return
end
else # if media
redirect_to share_error_url, :flash => { :error => "Media has no public link." } and return
end
else # if document doesn't exist
redirect_to share_error_url, :flash => { :error => "Can't find that document. Maybe check your link. Or maybe it was deleted. Ask #{@user.name}." } and return
end
end
正如您可能猜到的那样,在某些情况下它很容易出错。有没有更简洁的方法来重写它以使其更健壮?我知道每个方法应该只有一个render 或redirect_to,但我不知道还有什么方法可以实现我需要的。
谢谢!
【问题讨论】:
-
我也想知道这一点,因为我的很多代码目前看起来都是这样的。
标签: ruby-on-rails ruby-on-rails-3 model-view-controller