обновление значения виртуального атрибута в представлении не обновляет модель - PullRequest
1 голос
/ 09 ноября 2010

Я обновляю значение виртуального атрибута в моем представлении, но это не отражается в экземпляре модели.

Например:

MyModel.erb

attr_accessor_with_default :hello_world, false

View.html.erb

<%= @mymodel.hello_world %><br/>
<% 
    if ( @mymodel.hello_world == false )
        @mymodel.hello_world = true
    end
%>
<%= @mymodel.hello_world %>

Просмотр выводов:

false
true

Однако, когда я перезагружаю страницу, отображается тот же вывод, когда он должен быть:

true
true

Я вижу вышеупомянутое поведение в форме редактирования. Когда я отправляю форму (с ошибками проверки), она перезагружается (отображаются ошибки), но значение hello_world не обновляется.

У вас есть предложения? Что я должен сделать, чтобы получить желаемое поведение?

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

Ваша страница работает должным образом.Виртуальный атрибут hello_world инициализируется как false, а затем устанавливается в true.Проблема в том, что вы ожидаете, что произойдет, когда вы обновите страницу.

Обновленная страница выглядит как совершенно новый запрос к рельсам с собственной (новой) копией @mymodel.Вот почему ваши результаты совпадают, когда обновление выполняется, поскольку старое значение @ mymodel.hello_world теряется при создании нового экземпляра.

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

0 голосов
/ 09 ноября 2010

Виртуальные атрибуты не являются постоянными между запросами, поскольку они просто хранятся в экземпляре @mymodel, а не в сеансе или базе данных. Каждый раз, когда вы обновляете страницу, создается новый экземпляр @mymodel, который ничего не знает о ранее назначенных ему виртуальных атрибутах.

Если это атрибут, который вы хотите сохранить, вы должны сохранить его в базе данных как обычный атрибут модели.

...