Rails: самый элегантный способ визуализации атрибутов записи в цитате - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть запись @story со следующими атрибутами:

  • author
  • author_title
  • year
  • source
  • source_link

Я отображаю его в виде, чтобы оно выглядело так:

Джеймс Джойс (автор), 1882, Википедия

Я надеюсь, что есть менее запутанный способ генерирования DOM для цитаты, чем этот (который является несовершенным, как я объясню ниже):

<%= @story.author %><% if !@story.author_title.blank? %> (<%= @story.author_title %>)<% end %><% if !@story.year.blank? %>, <%= @story.year %><% end %><% if !@story.source_link.blank? %>, <%= link_to @story.source, @story.source_link, target: "_blank" %><% end %>

Поскольку ни один изполя являются обязательными, если я подозреваю, что проблема if-field-not-nil-then-you-may-need-a-запятая может быть решена более элегантно.Например, если author пусто, я не хочу отображать author_title или запятую.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Смотрите мои комментарии, Декораторы это путь.Вы научитесь любить его и никогда не возвращаться.

Если вы считаете, что это слишком много для однократной простой задачи ... тогда создайте метод модели для этого:

class Story < ApplicationRecord

  .... #other stuff

  def author_with_title_and_year
    "#{author} #{author_title}, #{year}".squish
  end

end

И добавьте за ним ссылку вручную:

<p><%= @story.author_with_title_and_year %> <%= link_to source, source_link %></p>
0 голосов
/ 08 февраля 2019

Вы можете попробовать следующий код

создать метод двух помощников

def author_story(author)
   [@story.author_title, @story.year].compact.join(',')
end

def author_link
  link_to(@story.source_link, text: 'testing')
end

и в поле зрения

<% if @story.author.present? %>
  <div>
     <span>
        <%= author_story(@story) %> 
     </span>
     <span>
        <%= author_link(@story) %>
     </span>
  </div>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...