использование модификатора условного оператора в шаблонах Rails - PullRequest
2 голосов
/ 07 ноября 2008

У меня есть шаблон rails (файл .rhtml), генерирующий объект Javascript. Это выглядит примерно так:

var volumes = {
  <% for volume in @volumes %>
    <%= volume.id %> : <%= volume.data %> 
    <%= ',' unless volume === @volumes.last %>
  <% end %>
};

Обратите внимание на модификатор оператора unless для подавления печати запятой после последнего элемента (для удовлетворения Internet Explorer, который невероятно не поддерживает запятые в объявлениях свойств JSON).

Кажется, это работает, но, как стиль, люди думают, что разумно полагаться на <%= value unless condition %> в шаблоне, генерирующем соответствующий вызов render?

Ответы [ 3 ]

6 голосов
/ 07 ноября 2008

Я не понимаю, почему нет, но, как правило, если вы задаете условия запятой на последнем члене, вы, вероятно, захотите использовать join вместо:

<%= @volumes.map {|v| "#{v.id} : #{v.data}"}.join "," %>
3 голосов
/ 08 ноября 2008

Если вы хотите создать JSON (и, кстати, вы создаете объект JavaScript, а не массив), я предлагаю использовать метод to_json:

var volumes = <%= @volumes.inject({}){|h,v| h.merge(v.id=>v.data)}.to_json %>;

или

var volumes = <%= Hash[*@volumes.map{|v| [v.id, v.data]}.flatten].to_json %>;

Еще лучше было бы перенести конструкцию Ruby Hash на модель, поскольку она слишком сложна для просмотра.

class Volume
  def self.to_hash(volumes)
    Hash[*volumes.map{|v| [v.id, v.data]}.flatten]
  end
end

и тогда в поле зрения вы можете поместить гораздо более простой код:

var volumes = <%= Volume.to_hash(@volumes).to_json %>;
0 голосов
/ 07 ноября 2008

Или даже:

<%= @volumes.map { |v| "#{v.id} : #{v.data}"}.to_sentence -%>

Чтобы получить "a: что-то, b: что-то еще, c: что-нибудь и d: другое"

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