Предаване на променлива в 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
ОП - НЕ ТРЯБВА да е 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 стойност на 'bad', когато методът 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)


Благодаря. опитвам се да използвам състояние на преглед. но хвърля изключение като невалидни аргументи. Моля, вижте кода по-долу.
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