простая оптимизация кода рельсов - PullRequest
0 голосов
/ 22 декабря 2010
<% if defined?(@club.name) && !(@club.name).nil? %>
<%= @club.name %>
<% else %>
clubs:
<% end %>

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

Ответы [ 2 ]

1 голос
/ 22 декабря 2010

Возможно:

<% if @club && @club.name %>
  <%= @club.name %>
<% else %>
  clubs:
<% end %>

Поскольку @club предположительно либо будет установлен на объект Club, либо будет установлен на nil, нам не нужно явно проверять, есть ли у @club метод name. Вместо этого мы можем просто проверить, что @club установлен на всех, и для этого будет достаточно проверки на правдивость.

Аналогично, нам не нужна явная проверка nil на @club.name. Все значения, кроме false и nil, считаются «правдивыми», и, поскольку название клуба предположительно не может быть установлено на false, просто проверка его правдивости эквивалентна явной проверке, является ли она nil.


В своих комментариях Вайолет указала, что на самом деле это довольно распространенная идиома в мире Rails, поэтому ярлык на самом деле существует. В среде Rails все объекты, включая nil, имеют метод с именем try. try вызывает имя метода, переданное ему в качестве аргумента, и либо возвращает возвращаемое значение этого метода, либо nil, если этот метод не определен.

Так, например:

no_name = Club.new
no_name.try(:name) # => nil

so = Club.new :name => 'StackOverflow'
so.try(:name) # => "StackOverflow"

nil.try(:name) # => nil

Таким образом, следующее является точным эквивалентом первого блока кода:

<% if @club.try(:name) %>
  <%= @club.name %>
<% else %>
  clubs:
<% end %>

намного красивее:)

0 голосов
/ 22 декабря 2010
<%= @club.name || "clubs:" %> 

как насчет этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...