我一直在使用Rails一段时间,我发现自己一直在做的一件事是检查在我的视图代码中显示之前某些属性或对象是否为零.我开始怀疑这是否总是最好的主意.
到目前为止,我的理由是,由于我的应用程序依赖于用户输入意外的事情可能会发生.如果我从编程中学到一件事情,那么用户输入的程序员没有想到的是运行时错误的最大来源之一.通过检查零值,我希望能够回避这个问题,并且让我的意见优雅地处理这个问题.
事情是,我通常因为各种原因在我的模型或控制器代码中都有类似的无效或无效值检查.我不会在最严格的意义上将其称为代码重复,但它似乎并不是很干燥.如果我已经检查了我的控制器中的零对象是否可以,如果我的视图只是假定对象真的不是零?对于可以显示的零的属性,对我来说每次检查都是有意义的,但对于对象本身我不知道最好的做法是什么.
以下是我正在谈论的简化但典型的例子:
控制器代码
def show @item = Item.find_by_id(params[:id]) @folders = Folder.find(:all,:order => 'display_order') if @item == nil or @item.folder == nil redirect_to(root_url) and return end end
查看代码
<% if @item != nil %> display the item's attributes here <% if @item.folder != nil %> <%= link_to @item.folder.name,folder_path(@item.folder) %> <% end %> <% else %> Oops! Looks like something went horribly wrong! <% end %>
这是一个好主意还是只是愚蠢?
解决方法
您的示例代码重构:
控制器代码. (我认为这是ItemsController)
def show # This will fail with 404 if item is not found # You can config rails to pretty much render anything on Error 404 @item = Item.find(params[:id]) # doesn't seem to be used in the view # @folders = Folder.find(:all,:order => 'display_order') # this is not needed anymore,or should be in the Error 404 handler #if @item == nil or @item.folder == nil # redirect_to(root_url) and return #end end
查看代码,因为控制器确保我们有@item
#display the item's attributes here <%= item_folder_link(@item) %>
助手代码:
# display link if the item has a folder def item_folder_link(item) # I assume folder.name should be a non-blank string # You should properly validate this in folder model link_to( item.folder.name,folder_path(item.folder) ) if item.folder end
无论如何,我尽量保持观点非常简单.通常,如果我在视图中看到循环和条件,我尝试将它们重构为助手.