Подтвердить что ты не робот

Такая же переменная экземпляра для всех действий контроллера

У меня есть контроллер рельсов с двумя определенными действиями: index и show. У меня есть переменная экземпляра, определенная в действии index. Код выглядит примерно так:

def index
  @some_instance_variable = foo
end

def show
  # some code
end

Как я могу получить доступ к шаблону @some_instance_variable в show.html.erb?

4b9b3361

Ответ 1

Если вы не показываете show.html.erb из действия index, вам также нужно установить @some_instance_variable в действие show. Когда вызывается действие контроллера, он вызывает метод сопоставления, поэтому содержимое вашего метода index не будет вызываться при использовании действия show.

Если вам нужно @some_instance_variable установить одно и то же в действиях index и show, правильным способом было бы определить другой метод, называемый как index, так и show, который устанавливает переменная экземпляра.

def index
  set_up_instance_variable
end

def show
  set_up_instance_variable
end

private

def set_up_instance_variable
  @some_instance_variable = foo
end

Приведение частного метода set_up_instance_variable запрещает его вызывать как действие контроллера, если у вас есть шаблоны подстановочных знаков (т.е. match ':controller(/:action(/:id(.:format)))')

Ответ 2

Вы можете определить переменные экземпляра для нескольких действий с использованием фильтра before, например:

class FooController < ApplicationController
  before_filter :common_content, :only => [:index, :show]

  def common_content
    @some_instance_variable = :foo
  end
end

Теперь @some_instance_variable будет доступен из всех шаблонов (включая частичные), отображаемых из действий index или show.