#ruby-on-rails-3 #session
#ruby-on-rails-3 #сессия
Вопрос:
У меня есть объект транзакции, и я хочу:
- Проверьте, существует ли сеанс Cart.
- Если да, свяжите транзакцию с идентификатором этой корзины из сеанса.
- Если нет, создайте новый объект Cart и присвоите его идентификатор переменной сеанса.
Взаимосвязь является:
Cart has_many Transactions
Transaction belongs_to Cart
Мой вопрос: Как вы / Какой наилучший способ создать объект Cart и связанный с ним сеанс из контроллера транзакций?
Я попробовал что-то подобное в действии Transaction new:
@cart = Cart.new
И это в действии создания транзакции:
@cart = Cart.new(params[:cart])
session[:cart] = @cart.id
Но это не создает объект сеанса или корзины. И при поиске в Google я не смог найти документацию по этому типу вещей. Кто-нибудь знает, как это делается правильно?
Ответ №1:
Cart.new
… только создаст экземпляр новой корзины, но не будет сохранять ее в базе данных. Объект Cart необходимо сохранить в базе данных, если он будет использоваться в запросах.
Используйте это для сохранения объекта Cart:
Cart.create(params[:cart])
или
@cart.save!
Для этого:
session[:cart] = @cart.id
… вы поступили правильно, сохранив идентификатор в сеансе 🙂 Но обратите внимание, что вам нужно извлекать это снова при каждом запросе. Таким образом, вы могли бы добавить помощника в свой application_controller.rb
с чем-то вроде:
def current_cart
Cart.find_by_id(session[:cart])
end
…. который мог бы вернуть nil
корзину.
Комментарии:
1. Здесь у меня возник один последующий вопрос: я попытался добавить идентификатор клиента к объекту корзины, используя session[:customer_id] (который существует), но это не работает, когда я делаю @cart.customer_id = session[:customer_id]. Существует ли другой способ добавления информации для заполнения полей в контроллере при использовании метода Cart.create? Еще раз спасибо за любую помощь!
2. Вам нужно сохранить объект cart после того, как вы присвоите ему customer_id:
@cart.save
. При использованииCart.create
вы можете предоставить хэш параметров, одним из которых является:customer_id
, или вы можете просто назначить идентификатор клиента объекту после его создания, а затем сохранить его снова.3. С другой стороны, постарайтесь не полагаться на сеанс для сохранения состояния. Это может быть довольно хрупким (например, если пользователь удаляет свои файлы cookie). Но кажется, что для того, что вы делаете, это нормально.
4. Еще одна вещь 🙂 — если вы используете хорошую библиотеку аутентификации (Devise, Clearance, Authlogic и т.д.), Вам не нужно сохранять customer_id в сеансе, поскольку библиотека сделает для вас доступным
current_user
объект.5. Спасибо за всю помощь! Я попробую
@cart.save
после присвоения customer_id. Я пытаюсь разработать полноценное приложение без плагинов, чтобы изучить фреймворк. Итак, аутентификация (которая выполнена) и корзина покупок (в работе) выполняются вручную. Но не волнуйтесь, это еще не запущено в производство или что-то еще — скорее функциональная демонстрация на данном этапе 🙂