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

时间:2015-08-12 12:17:58

标签: ruby-on-rails ruby ruby-on-rails-4 logic conditional-statements

人类的逻辑是:

  • 记者可以更新原始文章的正文(将状态设置为'原始更新')
  • Reporter可以在文章底部添加单独的更新(文章has_many更新)
  • 记者无法对文章做任何事情

然后,这会用于告诉读者前端(包含漂亮的原始更新'或者更新'标签),了解原始新闻报道是否或如何更新自它首次出版,如果你真的对一个故事感兴趣,这很重要。

所以... 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" %>

2 个答案:

答案 0 :(得分:2)

在你达到第三个条件之前,你会抓住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

装饰师也会工作我猜...:)

答案 1 :(得分:1)

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

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

首先在模型中创建方法:

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

然后我建议你使用像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>