【问题标题】:Ruby on Rails: conditionally display a partialRuby on Rails:有条件地显示部分
【发布时间】:2011-01-23 12:07:46
【问题描述】:

我不确定我是否在这里采用了最好的方法,但我有一个数据块,我想在搜索完成后显示并且之前根本不存在。首先,没有什么可显示的,其次它引用的模型是 nil 所以它会抛出异常。

我将此块放置在部分模板中,并将其添加到布局中的适当位置。有没有办法干净地有条件地渲染部分?有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: ruby-on-rails ruby partial-views


    【解决方案1】:

    一种简单的方法是使用辅助方法。助手往往比将逻辑直接放在视图中更干净。

    所以,你的观点可能是这样的:

    <%= render_stuff_conditionally %>
    

    你的助手会有一种方法来控制它:

    def render_stuff_conditionally
      if @contional_check
        render :partial => 'stuff'
      end
    end
    

    显然事物的命名更恰当

    【讨论】:

    • 同意,最好将逻辑放在助手中。
    • 我不同意。控制器逻辑和视图逻辑之间有明显的区别,这就是视图逻辑。就像我建议的那样,它可以作为一个简洁的单行来完成。此选项只会使调试或维护代码时更难找出正在检查的条件。
    • 我认为值得考虑这种情况以及您从使用或不使用帮助程序中实际获得的收益。如果您正在考虑填充到帮助程序中的代码将提高视图的可读性,那么这对您来说可能是值得的。如果将条件(或任何代码)留在视图中会使代码更具可读性和可维护性,那么也需要考虑这一点。 Helpers 最终可能成为各种代码的包罗万象,在这种情况下,您的视图代码可能很漂亮,但您只是“挤压了气球”(并且混乱并没有消失)。
    【解决方案2】:

    假设我没听错,你在视图级别执行此操作。

    <% if !@my_search_data.nil? %>
    <% render :partial => 'foo/bar' %>
    <% end %>
    

    希望对您有所帮助。如果没有,也许发布您的代码示例。

    【讨论】:

    • 这实际上是我在等待回复时所做的。它有效,但如果可能的话,我更愿意在视图中避免条件逻辑。
    • Pete 的解决方案是这种情况下的最佳选择。
    • @Donald:没有理由回避视图中的逻辑。 “视图逻辑”和“应用程序逻辑”之间有一条细线。
    【解决方案3】:

    Ruby 允许你做这样的好事:

    <%= render :partial => "foo/bar" if @conditions %>
    

    为了便于阅读和理解,可以写成:

    <%= render(:partial => "foo/bar") if @conditions %>
    

    render 是一个函数,你向它传递一个哈希值,告诉它要渲染哪个部分。 Ruby 允许您将内容放在一行中(这通常使它们更易读和更简洁,尤其是在视图中),因此if @conditions 部分只是一个常规的 if 语句。也可以这样做:

    <% if @conditions %>
      <%= render :partial => "foo/bar" %>
    <% end %>
    

    编辑:

    Ruby 还允许您使用unless 关键字代替if。这使代码更具可读性,并让您不必进行否定比较。

    <%= render :partial => "foo/bar" if !@conditions %>
    #becomes
    <%= render :partial => "foo/bar" unless @conditions %>
    

    【讨论】:

    • &lt;%= render :partial =&gt; "foo/bar" unless @conditions %&gt; 是我正在寻找的简洁性。而且,关于您在下面的评论,我同意完全教条化关注点分离是愚蠢的。这实际上是我喜欢 Rails 模板灵活性而不是像 Django 这样的系统的原因。但我确实喜欢尽可能限制它。我猜是我做经典 asp 的噩梦般的回忆。感谢您的帮助!
    • 没问题。从 ASP 之类的东西切换的困难部分是定义应用程序/业务逻辑的结束位置以及视图逻辑的开始位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2016-02-26
    • 1970-01-01
    • 2013-08-06
    相关资源
    最近更新 更多