加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 在Ruby on Rails中查看无视图

发布时间:2020-12-16 22:30:02 所属栏目:百科 来源:网络整理
导读:我一直在使用Rails一段时间,我发现自己一直在做的一件事是检查在我的视图代码中显示之前某些属性或对象是否为零.我开始怀疑这是否总是最好的主意. 到目前为止,我的理由是,由于我的应用程序依赖于用户输入意外的事情可能会发生.如果我从编程中学到一件事情,那
我一直在使用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

无论如何,我尽量保持观点非常简单.通常,如果我在视图中看到循环和条件,我尝试将它们重构为助手.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读