Как мне кэшировать объекты модели ActiveRecord через перенаправления? - PullRequest
2 голосов
/ 10 января 2010

Возможно, это вопрос новичка, но я не уверен, какие термины искать.

Скажем, у меня есть объект CUSTOMER, и я хочу отправить СООБЩЕНИЕ этому клиенту.

Сначала я добавлю действие SENDMESSAGE на контроллер CUSTOMER, который создает объект сообщения. (Предположим, что это правильно?)

В этом случае, однако, вместо того, чтобы фактически отправлять сообщение из этого действия, мне нужно перенаправить в окно редактирования СООБЩЕНИЯ для захвата основного текста и т. Д.

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

def sendmessage
    @message = Message.new
    @message.title = 'WIBBLE'
    @message.thecustomer = self
    @message.save    
    respond_to do |format|
      format.html { redirect_to(edit_message_path(@ message)) }
      format.xml  { render :xml => @ message }
    end
end

Может быть, мой вопрос сводится к тому, каков "путь рельсов" для кэширования параметров и объектов в запросах и на нескольких экранах.

Рад, что на вас указывают веб-адреса, так как я ожидаю, что это просто.

Спасибо

Ответы [ 2 ]

1 голос
/ 11 января 2010

На самом деле это довольно распространенная задача, которую вы слишком усложняете. Способ Rails справиться с этим - не сохранять объект, о котором идет речь, а просто визуализировать представление, которое завершит действие.

class CustomersController < Application Controller
  def sendmessage
    @message = Message.new
    @message.title = 'WIBBLE'
    @message.thecustomer = self
    respond_to do |format|
      format.html { render "messages/edit" }
      format.xml  { render :xml => @ message }
    end
  end
end

Как правило, сохранение целых объектов в HTTP-запросах в Rails - плохая идея, единственный реальный способ сделать это - выполнить сеанс или флэш-хэш, как предлагает Джон Топли, но оба из них ограничены доступное пространство. Вот почему Франсуа Босолей предлагает хранить только идентификатор объекта в сеансе. В любом случае вы должны очистить любой хеш, когда закончите.

То, что вы должны делать здесь, - это проектировать действия вашего контроллера так, чтобы каждое действие полностью выполняло задачу. Завершение половины задачи и перенаправление таким образом, чтобы второе действие могло завершить задачу, может быть немного более СУХИМ, но оно плохо сочетается с потоком управления Rails. Как показано в примере, действие контроллера завершает всю обработку, необходимую для визуализации представления.

По сути, если вы хотите сохранить информацию, потому что вы перенаправляете. Вам будет проще визуализировать представление, на которое вы перенаправляете.

1 голос
/ 10 января 2010

Стандартным способом сохранения данных в запросах при создании веб-приложений является использование сеанса HTTP. Rails делает неявный хеш сессии доступным для этой цели. Используется так:

session[:message] = @message #store
@message = session[:message] #retrieve

Вы также можете использовать упаковщик сессий Rails flash для передачи информации от текущего действия к следующему. Обычно он используется для хранения текста, отображаемого в пользовательском интерфейсе, но вы можете использовать его для сохранения любого объекта:

flash[:message] = @message #store
@message = flash[:message] #retrieve

В обоих случаях хранящиеся у вас объекты должны быть сериализуемыми. Обратите внимание, что по умолчанию Rails хранит данные сеанса в зашифрованном cookie на клиенте; Считайте сильным намеком на то, что хранение большого количества данных в сеансе осуждается в мире Rails.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...