RoR 3: код не ведет себя одинаково в before_filter и в действии контроллера - PullRequest
0 голосов
/ 30 декабря 2011

Я должен что-то упустить из-за оператора && в ruby ​​(что, я сомневаюсь, является причиной такого поведения)?

Этот код: анонимный && user_signed_in?не генерирует вывод, находится ли он в before_filter application_controller или в действии домашнего контроллера.

И я не понимаю почему.

Подробности:

Я добавил этот код в контроллер приложения, и он будет работать как before_filter

anonymous = cookies['anonymous']
fresh_session = cookies['session_id'].nil?
rep = (fresh_session || (anonymous && user_signed_in?))
puts "REPONSE : #{rep}  session: #{fresh_session}  anonym #{anonymous} is there a curr user: #{user_signed_in?} /// BOTH: #{(anonymous && user_signed_in?)}"

Напечатанный результат:

REPONSE : true  session: false  anonym false is there a curr user: true /// BOTH: true

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

REPONSE : false  session: false  anonym false is there a curr user: true /// BOTH: false

Пожалуйста, помогите мне понять.

Редактировать (по запросу Клочне):

В app_controller:

Anon-class: String REPONSE : true  session: false  anonym false is there a curr user: true /// BOTH: true

В home_controller

Anon-class: FalseClass REPONSE : false  session: false  anonym false is there a curr user: true /// BOTH: false

Так что по какой-то причине его интерпретируют как строку.

1 Ответ

0 голосов
/ 30 декабря 2011

Попробуйте установить переменные в фильтре before как переменные экземпляра вместо локальных переменных.Таким образом, они будут сохраняться и оставаться установленными в действии контроллера, в отличие от переменных экземпляра.Поэтому измените метод, вызываемый с before_filter, следующим образом:

@anonymous = cookies['anonymous']
@fresh_session = cookies['session_id'].nil?
@rep = (fresh_session || (anonymous && user_signed_in?))
puts "REPONSE : #{@rep}  session: #{@fresh_session}  anonym #{@anonymous} is there a curr user: #{user_signed_in?} /// BOTH: #{(@anonymous && user_signed_in?)}"

И затем в вашем контроллере вы можете просто снова вставить эту строку:

puts "REPONSE : #{@rep}  session: #{@fresh_session}  anonym #{@anonymous} is there a curr user: #{user_signed_in?} /// BOTH: #{(@anonymous && user_signed_in?)}"

И он должен распечатать тот же самыйРезультаты. Локальные переменные доступны только из блока их инициализации .

...