Как я могу передавать объекты с одного контроллера на другой в rails?

Я пытался получить мою голову вокруг render_to, но у меня не было большого успеха.

по существу у меня есть методы контроллера:

def first
  #I want to get the value of VAR1 here
end

def second
  VAR1 = ["Hello", "Goodbye"]
  render_to ??
end

чего я не могу понять, так это как это сделать. Первоначально я просто хотел сделать первый.формат html.файл erb, но это тоже не сработало.

спасибо

Edit: я ценю ответы, которые я получил, однако все они, как правило, избегают использования метода рендеринга или redirect_to. Это в основном дело в том, что вы не можете передавать переменные от контроллера к контроллеру? Я должен думать, что есть какой-то способ, но я не могу его найти.

4 ответов


не рекомендуется назначать объект константе. Правда, это в глобальном пространстве, но это глобально для всех, поэтому любой другой пользователь, идущий на этот запрос, получит этот объект. Есть несколько решений.

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

<%= f.hidden_field :name %>

Если есть много полей, это может быть утомительно, так что вы можете цикл через params[...] хэш или column_names метод, чтобы определить, какие атрибуты, чтобы пройти.

кроме того, вы можете хранить атрибуты в тег сессии.

def first
  @item = Item.new(params[:item])
  session[:item_attributes] = @item.attributes
end

def second
  @item = Item.new(session[:item_attributes])
  @item.attributes = params[:item]
end

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

наконец, вы можете взглянуть на действует как плагин мастера.


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

@var1 = ["Hello", "Goodbye"]

можете ли вы объяснить, какова ваша цель?


вы рассматривали возможность использования flash-хэша? Многие люди используют его исключительно для сообщений об ошибках и тому подобное, он явно предназначен для передачи временных данных, которые могут вас заинтересовать.

в принципе, метод flash возвращает хэш. Любое значение, которое вы назначаете ключу в хэше, будет доступно для следующего действия, но затем оно исчезнет. Итак:

def first
  flash[:var] = ["hello", "goodbye"]
  redirect_to :action => :second
end

def second
  @hello = flash[:var].first
end

  1. Способ 1
    Глобальная переменная (сбой при одновременных запросах)
  2. Способ 2
    переменная класса (сбой при одновременных запросах)
  3. Способ 3

    • Stash объект на сервере между запросами. Типичный способ-сохранить его в сеансе, так как он автоматически сериализует/десериализует объект для вас.
    • сериализовать объект и включить его в форма где-то, и десериализовать его из параметров в следующем запросе. таким образом, вы можете хранить атрибуты в сеансе.

      def first
      @item = Item.new(params[:item])
      session[:item_attributes] = @item.attributes
      end
      
      def second
      @item = Item.new(session[:item_attributes])
      @item.attributes = params[:item]
      end
      
  4. путь 4
    Вспышка обеспечивает способ передачи временных объектов между действиями. Все, что вы поместите во вспышку, будет подвергнуто самому следующему действию, а затем очищено.
     def new
       @test_suite_run = TestSuiteRun.new
       @tests = Test.find(:all, :conditions => { :test_suite_id => params[:number] })
       flash[:someval] = params[:number]
     end 
     def create
    @test_suite_run = TestSuiteRun.new(params[:test_suite_run]) @tests = Test.find(:all, :conditions => { :test_suite_id => flash[:someval] })
    end
  5. Способ 5
    вы можете использовать кэш рельсы.

      Rails.cache.write("list",[1,2,3])
      Rails.cache.read("list")
    
    Но что происходит, когда разные сеансы имеют разные значения? Если вы не гарантируете уникальность имени списка в сеансе, это решение не будет выполнено во время параллельных запросов
  6. Способ 6
    В одном действии сохраните значение в таблице db на основе идентификатора сеанса, а другое действие может получить его из db на основе идентификатора сеанса.

  7. способ 7

    class BarsController < UsersController
    before_filter :init_foo_list

    def method1 render :method2 end

    def method2 @foo_list.each do | item| # do something end end

    def init_foo_list @foo_list ||= ['Money', 'Animals', 'Ummagumma'] end end

  8. путь 8
    От действия, отправленного на просмотр, и снова от представления, отправленного на другие действия в контроллер.