Как поставить логику в Rails помощник? - PullRequest
0 голосов
/ 14 сентября 2011

У меня есть представление, где я пытаюсь проверить, есть ли поле в таблице, и если это так, выведите только это поле.Если нет, он должен напечатать текст: «(нет)».На мой взгляд, у меня есть:

<%=  list_fields(feed) %>

И в моем вспомогательном файле у меня есть:

    def list_fields(feed)
        feed.xml_fields.each do |field|
            if field.tags?
                field.tags
            else
                puts "(none)"
            end
        end
    end

Прямо сейчас это отображает всю строку таблицы для каждого объекта поля, если у него есть теги, и«[]», если у него нет тегов.Я просто хочу, чтобы отображались отдельные записи тегов или "(нет)".Чего мне не хватает в моем помощнике?

Ответы [ 3 ]

2 голосов
/ 14 сентября 2011

У вас две проблемы.Во-первых, ваш помощник не возвращает значение, которое может быть включено в представление конструкцией <%= ... %>.

Вызов .each возвращает объект, для которого он имеетвызывается, в этом случае это будет feed.xml_fields, и он НЕ возвращает отдельные значения, рассчитанные блоком.

Вторая проблема заключается в том, что puts в Rails не помещает текств визуализированном виде - это не PHP.

Я не очень уверен, какой именно вывод вы ожидаете, но если вы хотите вернуть первое «поле» с «тегами», то вы можетесделать это:

def list_fields(feed)
  f = feed.xml_fields.detect {|field| field.tags? }
  f ? f.tags : "(none)"
end

Если вы хотите перечислить все теги и вернуть строку "(нет)", если тегов нет, используйте что-то вроде этого:

def list_fields(feed)
  f = feed.xml_fields.select {|field| field.tags? }.map {|field| field.tags }
  f.empty? ? "(none)" : f.join(", ")
end

Если вы хотите объединить поля с некоторой HTML-разметкой, например <br/>, используйте это:

def list_fields(feed)
  f = feed.xml_fields.select {|field| field.tags? }.map {|field| h(field.tags) }
  f.empty? ? "(none)" : f.join("<br/>").html_safe
end

Обратите внимание, что есть два изменения: индивидуальные tags значения экранируются функцией h, а затем присоединяемая строка помечаетсякак уже очищенный.В этом случае представление больше не будет экранировать строку.

Если вы действительно хотите использовать что-то вроде puts в представлениях или помощниках, тогда вы можете прочитать о методе concat .

1 голос
/ 14 сентября 2011

Вы должны изменить свою функцию таким образом:

def list_fields(feed)
    feed.xml_fields.each do |field|
        if field.tags?
            return field.tags
        else
           return "(none)"
        end
    end
end

Есть 2 изменения:

  • Не вставлять в помощник
  • возврат изпетля.Результатом each -loop является сам массив, поэтому в конце он все равно будет возвращен в вашей версии.

Я не понимаю, почему вы делаете цикл.

0 голосов
/ 14 сентября 2011

Возвращайте строки из вашего помощника, вместо использования puts. Я не знаю, какой формат field.tags, но я думаю, что это массив. Отформатируйте строку так, как вы хотите, и просто верните ее из помощника.

Что-то вроде:

def list_fields(feed)
  feed.xml_fields.each do |field|
    if field.tags?
       "some string"
    else
       "(none)"
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...