Ruby/Rails条件语句逻辑,多个数组值,与x.blank相反?
Ruby/Rails conditional statement logic, multiple array values, opposite of x.blank?
人的逻辑是:
- 记者可以更新原文章的正文(将状态设置为'original updated')
- 记者可以在文章底部单独更新(文章has_many更新)
- 记者对文章无能为力
然后用于告诉前端的读者(带有漂亮的 '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
我想装饰器也可以工作...:)
人的逻辑是:
- 记者可以更新原文章的正文(将状态设置为'original updated')
- 记者可以在文章底部单独更新(文章has_many更新)
- 记者对文章无能为力
然后用于告诉前端的读者(带有漂亮的 '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
我想装饰器也可以工作...:)