2010-01-10 2 views
2

Возможно, это вопрос новичков, но я не уверен, какие условия искать.Как кэшировать объекты модели ActiveRecord через перенаправления?

Скажем, у меня есть объект 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 

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

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

Благодаря

ответ

1

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

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

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

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

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

+0

Большое спасибо, Джон.Содержание сеанса в файле cookie звучит как нечетное дизайнерское решение! –

+0

Могу ли я также спросить, используете ли вы сеанс для кэширования действий контроллера. например мое действие INDEX выполняет фанковый запрос на основе входящих параметров. Я хочу кэшировать этот конкретный список результатов для последующего вызова SENDMESSAGE. (Это потенциально может означать тысячи объектов, хранящихся в cookie сеанса, так что угадайте их нет.) Однако во время вызова SENDMESSAGE у меня нет всех параметров, необходимых для повторного восстановления списка CUSTOMER? Может кэшировать эти параметры? (Множество способов сделать это, но ищет путь к рельсам!) –

+0

Похоже на кэширование параметров, чтобы вы могли восстановить запрос, было бы возможным. Обратите внимание, что я сказал, что хранилище сеансов cookie является стандартным Rails. config.action_controller.session_store' в 'environment.rb' позволяет вместо этого использовать базу данных для хранения сеанса. –

1

На самом деле это довольно обычная задача, которую вы усложняете. Метод 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 является плохой идеей, единственный реальный способ сделать это, чтобы это в ходе сессии или флэш-хэш, как говорит Джон Topley, но оба эти ограничены в объеме доступного пространства. Вот почему François Beausoleil предлагает только хранить идентификатор объекта в сеансе. В любом случае вы должны очистить любой хэш, когда закончите с ним.

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

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

+0

Вы правы, что рендеринг лучше, чем перенаправление, где это возможно. не всегда возможно; см. http://stackoverflow.com/questions/5175385/where-to-render-comments-controller-in-rails-on-model-validations-failure/8706403#8706403 –

Смежные вопросы