Передача переменной в цикле erb

Я новичок в Ruby и Rails. Я просматриваю набор записей и проверяю возраст. Если есть одна запись старше 14 дней, я хочу установить флаг, что этот набор записей требует внимания или является «плохим». Я изо всех сил пытаюсь понять, как передать переменную в цикл erb, в этом случае я использую current_class.

В моем контроллере у меня есть этот код:

def current_class
    @current_class = (params[:current_class]) 
end

В моем application_helper у меня есть следующий код:

def name_class(t2 = nil, test_class)
    t1 = Time.now
    age = (t1 – t2) / 86400
    if test_class == nil || “good”
        current_class = age >= 14 ? “bad” : “good”
    else
    end
    return current_class
end

На мой взгляд, у меня есть следующий код.

<% foo.each do |bar| %>
    <%= name_class bar.created_at, @current_class %>
    <%=h current_class %>
<% end %>

Результатом будет оценка текущего узла, но то, что я пытаюсь сделать, это то, что как только я попаду в запись старше 2 недель, у current_class будет значение «плохое» для остальной части этого набора. Любые указатели на то, что я делаю неправильно?

Отредактировано по запросу для ясности.

Как правило, я пытаюсь сохранить значение через цикл erb.

Итак, у меня есть набор из 5 записей с именем foo. Каждая запись имеет атрибут с именем bar:

1 = A
2 = A
3 = B
4 = A
5 = A

Когда я перебираю foo, я хочу сохранить значение foo.bar в @baz. Как только я столкнусь со значением B, я хочу, чтобы @baz сохранил значение B. Имеет ли смысл?

Заранее спасибо.


person EricP    schedule 07.03.2014    source источник
comment
Еще кое-что. напиши else end return current_class как else current_class end   -  person Arup Rakshit    schedule 07.03.2014
comment
Вы еще больше всех запутали. Что такое A и B? Это значение bar? В вашем коде вы нигде не используете @baz. Внезапно оно появилось в редактируемом разделе.   -  person Kirti Thorat    schedule 07.03.2014
comment
@KirtiThorat OP также неправильно написал блок if..else..end.   -  person Arup Rakshit    schedule 07.03.2014
comment
OP - это НЕ ДОЛЖНО быть current_class, скорее @current_class.   -  person Arup Rakshit    schedule 07.03.2014
comment
Ни current_class, ни @current_class. ДОЛЖНО быть test_class.   -  person Kirti Thorat    schedule 07.03.2014
comment
@KirtiThorat Я согласен, я неправильно скопировал .. извините   -  person Arup Rakshit    schedule 07.03.2014
comment
Метод @RafaelRamosBravin name_class находится в ApplicationHelper. Итак, как ему получить доступ к переменной экземпляра контроллера?   -  person Kirti Thorat    schedule 07.03.2014
comment
@KirtiThorat О, я вижу, это в ApplicationHelper. В таком случае вы правы. Хотя это не имеет особого смысла, name_class должен быть в конкретном помощнике.   -  person Rafael Ramos Bravin    schedule 07.03.2014
comment
@EricP Скажи мне, правильно ли я понял. Вы хотите установить значение @current_class как «плохое», когда метод name_class находит одну неверную запись?   -  person Rafael Ramos Bravin    schedule 08.03.2014
comment
@RafaelRamosBravin Точно. Спасибо!   -  person EricP    schedule 08.03.2014
comment
@EricP Что, если он найдет несколько плохих записей? Разве он не должен сохранять значение каждого из них?   -  person Rafael Ramos Bravin    schedule 08.03.2014
comment
@RafaelRamosBravin нет, я использую эту логику, чтобы изменить уровень представления приложения. Как только будет найдена одна плохая запись, презентация изменится. В наборе записей может быть 10 хороших записей, одна плохая инициирует изменение.   -  person EricP    schedule 08.03.2014
comment
@RafaelRamosBravin У меня был тот же вопрос, что делать, если есть несколько плохих записей. Хорошо, что вы поняли, чего именно хотел ОП. +1   -  person Kirti Thorat    schedule 08.03.2014


Ответы (2)


Вы можете использовать это в своем представлении:

    <% @current_class = 'bad' if foo.any?{|bar| name_class(bar) == 'bad'} %>

    <% foo.each do |bar| %>
      <%= name_class(bar) %>
      <%h @current_class %>
    <% end %>

Первая строка кода проверит наличие плохих записей в foo, а затем установит @current_class в 'bad', если они есть.


И в вашем вспомогательном методе:

    def name_class(bar)
      t2 = bar.created_at
      t1 = Time.now
      age = (t1 – t2) / 86400

      return age >= 14 ? “bad” : “good”
    end

Метод name_class просто проверит, является ли один объект bar плохим или хорошим.

person Rafael Ramos Bravin    schedule 07.03.2014
comment
Это сработало. Спасибо! Проголосовал бы за это, но у меня пока недостаточно представителей :| - person EricP; 08.03.2014

Если я правильно понял, вы хотите проверить каждую запись foo, если foo.created_at уже прошло 2 недели, тогда вы хотите «пометить» ее как «Плохую», в противном случае, если еще ‹ 14 дней, «пометить» как «Хорошую». Если это так, и поскольку вы хотите, чтобы он сохранялся, я бы посоветовал вам добавить столбец/атрибут в таблицу foo, скажем, логическое значение с именем «is_expired». Но мой код ниже предполагает, что вы не будете использовать новый столбец, например «is_expired».

Лично я бы использовал 'scope' внутри файла модели 'foo'. Но если вы просто действительно хотите, чтобы это было в представлении, или вы все еще собираетесь выполнять с ним некоторую обработку, я напишу что-то вроде ниже

<%
good_foos = []
bad_foos = []
%>
<% foo.each do |f| %>
    <!-- If GOOD FOO --!>
    <% if name_class(f.created_at, @current_class) == "good" %>
        <!-- ADD FOO'S ID TO 'GOOD' ARRAY -->
        <% good_foos << f.id %>
    <!-- ELSE IF BAD FOO -->
    <% else %>
        <!-- ADD FOO'S ID TO 'BAD' ARRAY -->
        <% bad_foos << f.id %>
    <% end %>
<% end %>
<!-- PROCESS THE GOOD FOOS AND BAD FOOS HERE -->
<!--EX -->
<%= Foo.where(:id => good_foos).each do %>
    <!-- DO SOMETHING WITH FOO -->
<% end %>
person Jay-Ar Polidario    schedule 07.03.2014