Я сталкиваюсь с некоторой проблемой области видимости, которая препятствует правильной инициализации переменных экземпляра помощниками, вызываемыми из представления.
#sample_controller.rb
class SampleController < ApplicationController
def test
end
end
#application_controller.rb
helper_method :display
def display
if not defined? @display
return @display = "a"
else
return @display += "a"
end
end
#test.html.erb
<%= display %>
<%= display %>
<%= @display %>
<%= @display.reverse %>
Когда отображается образец / тест, он умирает с ошибкой «при оценке nil.reverse». Это удивительно, потому что первые два вызова для отображения должны были инициализировать @display, я бы подумал. Если <% = @ display.reverse%> удалено, вывод будет «a aa», указывая, что переменная экземпляра @display устанавливается вспомогательным методом, но нет доступа к ней в представлении.
Если контроллер изменен таким образом, чтобы он стал (с исходным кодом вида):
class SampleController < ApplicationController
def test
display
end
end
Выход становится «аа ааа а а». Если я сделаю 2 вызова для отображения в контроллере, я получу «ааа аааа аа аа». Поэтому кажется, что только вызовы, сделанные в контроллере, изменят переменную экземпляра SampleController, тогда как вызовы в представлении изменят переменную экземпляра для ApplicationController, к которому у представления нет доступа.
Это ошибка в Rails или я неправильно понимаю, и это по какой-то причине предназначенная функциональность?
Контекст, в котором я столкнулся с этой ошибкой, пытается создать logged_in? Метод ApplicationController, который устанавливает переменную @user при первом вызове и возвращает true или false, если пользователь вошел в систему. Это не будет работать, если я не добавлю ненужный вызов в контроллер, прежде чем пытаться использовать его в представлении.