Ruby/Rails条件语句逻辑,多个数组值,与x.blank相反?

Ruby/Rails conditional statement logic, multiple array values, opposite of x.blank?

人的逻辑是:

然后用于告诉前端的读者(带有漂亮的 'original updated' 或 'updates added' 标签)原始新闻故事自首次发布以来是否更新或如何更新,这如果您真的对故事感兴趣,这很重要。

所以... 1) 以下逻辑有效,但上半部分看起来很乱。如何在一个 == 数组中包含三种可能性?

<% if @articleupdates.blank? && @article.status == "published" %>

<% elsif @articleupdates.blank? && @article.status == "editing" %>

<% elsif @articleupdates.blank? && @article.status == "draft" %>

<% elsif @articleupdates.blank? && @article.status == 'updated' %>
  <div class="alert-update"><span class="updated-label">ORIGINAL UPDATED</span></div>
<% else %>
  <div class="alert-update"><span class="updated-label">UPDATES ADDED</span></div>
<% end %>

还有……2)虽然上面的方法有效,但有什么简单的方法可以做到这一点……

IF original-article updated AND additional-updates not added, print 'original updated'
ELSIF original-article not updated AND additional-updates added, print 'updates added' 
ELSIF original-article updated AND additional-updates added, print both 'original updated' AND 'updates added'
ELSE don't print anything

或者也许:

IF original-article updated, print 'original updated'
ELSIF additional-updates added, print 'updates added' 
ELSIF original-article updated AND additional-updates added, print both 'original updated' AND 'updates added'
ELSE don't print anything

??我认为缺少的一点是: @articleupdates.blank? 的反义词是什么?

更新 按照 kj 在下面的快速回答。更简单的版本现在几乎可以使用了:

<% if @articleupdates.present? %>
  UPDATES ADDED
<% elsif @article.status == "updated" %>
  ORIGINAL UPDATED
<% elsif @articleupdates.present? && @article.status == "updated" %>
  UPDATES ADDED + ORIGINAL UPDATED
<% else %>
<% end %>

第三部分由于某种原因无法运行:<% elsif @articleupdates.present? && @article.status == "updated" %>

您的代码包含以下反模式:

  • 你重复了很多@articleupdates.blank?(干)
  • 你检查一个对象的内部(告诉不要问)

首先在您的模型中创建方法:

def published?
  status == "published"
end
#etc...

然后我建议您使用 gem 创建演示者,例如 draper

class ArticleDecorator < Draper::Decorator
  delegate_all

  def publication_status
    if newsitems.present?
      if updated?
        "UPDATES ADDED + ORIGINAL UPDATED"
      else
        "UPDATES ADDED"
      end
    elsif updated?
      "ORIGINAL UPDATED"
    else
      ""
    end
  end
end

在你的控制器中:

@article = @article.decorate

终于在您看来:

<div class="alert-update"><span class="updated-label"><%= @article.publication_status %></span></div>    

在你达到第三个条件之前,你会赶上 status == "updated"。将它移到顶部,因为它是最复杂的条件。

<% if @articleupdates.present? && @article.status == "updated" %>
    UPDATES ADDED + ORIGINAL UPDATED
<% elsif @articleupdates.present? %>
    UPDATES ADDED
<% elsif @article.status == "updated" %>
    ORIGINAL UPDATED
<% end %>

编辑

# Article model
def updated?
    status == 'updated'
end

# article helper
def article_label(article)
    if article.newsitems.present? && article.updated?
        label = "UPDATES ADDED + ORIGINAL UPDATED"
    elsif article.newsitems.present?
        label = "UPDATES ADDED"
    elsif article.updated?
        label = "ORIGINAL UPDATED"
    end
    content_tag :div, content_tag(:span, label, class: 'updated-label'), class: 'alert-update'
end

我想装饰器也可以工作...:)