Вспомогательный метод не обновляет переменную экземпляра Controllers - PullRequest
0 голосов
/ 24 мая 2011

Я определяю переменную instance_variable в моем контроллере страниц и инициализирую ее строкой.

Я включаю эту переменную instance_ в страницу.

Она отображается.

Отлично!

Если моя страница содержит макет _header, который использует метод Pages Helper, который обновляет эту instance_variable, моя страница отображает оригинал, а не обновленную строку.

Журналы показывают, что _header был визуализирован ранеестраница, поэтому он вызвал метод Pager Helper, который обновляет этот instance_variable ПЕРЕД тем, как он отобразил мою страницу.

Так почему же эта страница не содержит обновленную строку?

Я новичок в RoR,пытаясь понять, как это работает.

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

РЕДАКТИРОВАТЬ:

Хорошо.Даже если журнал сервера rails показывает, что страница yield ed была обработана после render ed страниц ... Похоже, она была обработана до их.

Если я изменю переменную instance_variable на первой странице render ed, измененное значение будет доступно на всех следующих render ed страницах, но неизменным на странице yield ed, даже если yield лежит в промежутке между render (в application.html.erb), и журналы сервера rails показываютдаже это было отображено как последнее.

РЕДАКТИРОВАТЬ:

По какой-то причине я использую слово «макеты», где мне пришлось бы использовать слово «частичные».

Ответы [ 2 ]

0 голосов
/ 24 мая 2011

Мне тоже было любопытно, поэтому я хотел посмотреть «порядок обработки».Это результат этого теста.Это прояснило для меня вещи ... надеюсь, это ответит на вопрос, даже если не решит проблему.Все взгляды в хамле.Прошу прощения за посторонний код, т. Е.% Br.Я собирался прояснить краткость.

Контроллер:

@test = 1

Помощник:

def change_test
  @test += 1
end

Макет приложения:

!!!
%html
  %body
    Application Layout Pre-change = 
    = @test
    %br
    Application Layout Change = 
    = change_test()
    %br    
    = yield

Результат:

%br
Pre-Header = 
= @test
%br
Pre Header change = 
= change_test()
%br
= render "test_header"
%br
Yeilded page Pre-change = 
=@test 
%br
Yeilded Page Change = 
= change_test()
%br
= render "test_footer"
%br

Частичный заголовок:

%br
Header Pre-change = 
= @test
%br
Header change = 
= change_test()
%br

Нижний колонтитул:

%br
Footer Pre-change = 
= @test
%br
Footer change = 
= change_test()
%br

Выход:

Application Layout Pre-change = 5 
Application Layout Change = 6 

Pre-Header = 1 
Pre Header change = 2 

Header Pre-change = 2 
Header change = 3 

Yeilded page Pre-change = 3 
Yeilded Page Change = 4 

Footer Pre-change = 4 
Footer change = 5 
0 голосов
/ 24 мая 2011

Переменные экземпляра копируются, а не разделяются между объектами. В представлении создаются новые переменные с такими же именами и «указывающие» на тот же объект, на который ссылались переменные в контроллере. Таким образом, если вы назначите новое значение переменной в представлении, другие объекты не будут знать об этом изменении.

Но если вам действительно нужно изменить объект, на который ссылается какая-либо переменная, измените этот объект вместо назначения нового для переменной. Пример скажет вам, что я имею в виду.

@var = "a new string" # it creates a new String object.
@var.replace "a modified string" # it changes the content of the object.

Если вы используете метод 'replace' (такой метод есть у объектов String), то ваш контроллер может увидеть это изменение. Если вы просто назначите новый объект переменной, ваш контроллер не увидит изменения. Но не доверяйте мне слишком сильно, поскольку я обычно не изменяю объекты в представлении. Просто проверь это.

...