Как мне применить стиль к , если условие существует, и убрать его, если его нет в Rails 3?

#css #ruby-on-rails-3

#css #ruby-on-rails-3

Вопрос:

Тег span в настоящее время выглядит следующим образом:

 <span class='best_in_place<%= ' list-downvoted' if upload.downvoted? %><%= ' list-upvoted ' if upload.upvoted? %>'
  

Однако, если за этот диапазон одновременно проголосовали с понижением и с повышением, то применяются оба стиля.

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

т.е. если за этот элемент ранее голосовали с понижением, удалите list-downvoted класс, и наоборот.

Редактировать: Добавлен рекомендуемый код в моем UploadsHelper

 module UploadsHelper
    def best_span_class_for_upload(upload)
      # Start with the base style
      css_class = 'best_in_place'

      # Add on any conditional styles using String#<< concatenation
      css_class << ' list-downvoted' if (upload.downvoted?)
      css_class << ' list-upvoted' if (upload.upvoted?)

      # Return the result
      css_class
    end
end
  

Теперь span выглядит вот так:

 <span class='<%= best_span_class_for_upload(upload) %>' id='best_in_place_upload_name' data-url='<%= upload_path(upload) %>' data-object='upload' data-attribute='name' data-formType='input' data-activator='span#upload-edit-name-<%= upload.id %>'><%= upload.name %></span>
  

Ответ №1:

Возможно, было бы лучше включить вспомогательный метод, чтобы избежать создания беспорядка в вашем шаблоне:

 <span class='<%= best_span_class_for_upload(upload) %>'>
  

Тогда вспомогательный метод, определенный в helper/ определенном модуле, будет выглядеть следующим образом:

 def best_span_class_for_upload(upload)
  # Start with the base style
  css_class = 'best_in_place'

  # Add on any conditional styles using String#<< concatenation
  css_class << ' list-downvoted' if (upload.downvoted?)
  css_class << ' list-upvoted' if (upload.upvoted?)

  # Return the result
  css_class
end
  

Обновить:

Исправленная версия, которая показывает только один из up или down:

 def best_span_class_for_upload(upload)
  # Start with the base style
  css_class = 'best_in_place'

  # Add on any conditional styles using String#<< concatenation
  if (upload.downvoted?)
    css_class << ' list-downvoted' 
  elsif (upload.upvoted?)
    css_class << ' list-upvoted'
  end

  # Return the result
  css_class
end
  

Комментарии:

1. будет ли это в ‘upload_helper’ ?

2. Кстати, это не работает. Я обновил вопрос с помощью кода, который я использовал. Может быть, я чего-то не понимаю?

3. Когда вы говорите «не работает», что вы имеете в виду? Ошибки? Вспомогательный метод должен создать простую строку на основе определенной вами логики. Представление просто использует этот же метод. Если вы помещаете это в представление, используемое UploadsController, тогда вы должны поместить это в связанный app/helpers/uploads_helper.rb .

4. Извините, он применяет оба стиля — независимо от того, что было сделано раньше …. что было моим первоначальным вопросом. Что я хочу, чтобы это делало, так это то, что если текущий класс является list-downvoted и upload.upvoted? истинным, он должен удалить list-downvoted и добавить list-upvoted . Как бы я это сделал с помощником?

5. Вместо этого вы могли бы изменить это if if на if elsif , и это должно сделать то, что вы хотите, в основном добавить одно или другое, но не оба.