Как я могу передавать объекты с одного контроллера на другой в 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
Глобальная переменная (сбой при одновременных запросах) - Способ 2
переменная класса (сбой при одновременных запросах) -
Способ 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
Вспышка обеспечивает способ передачи временных объектов между действиями. Все, что вы поместите во вспышку, будет подвергнуто самому следующему действию, а затем очищено.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
вы можете использовать кэш рельсы.Rails.cache.write("list",[1,2,3]) Rails.cache.read("list")
Но что происходит, когда разные сеансы имеют разные значения? Если вы не гарантируете уникальность имени списка в сеансе, это решение не будет выполнено во время параллельных запросов Способ 6
В одном действии сохраните значение в таблице db на основе идентификатора сеанса, а другое действие может получить его из db на основе идентификатора сеанса.-
способ 7
class BarsController < UsersController
before_filter :init_foo_listdef 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
От действия, отправленного на просмотр, и снова от представления, отправленного на другие действия в контроллер.