Rails 3 Вопросы по оформлению корзины покупок - PullRequest
1 голос
/ 31 мая 2011

У меня есть объект транзакций (как часть корзины), который принадлежит_ двум другим объектам, продуктам и услугам.Как продукты, так и услуги вложены в транзакции для создания URL-адресов, таких как / products / 1 / Transactions / new и / services / 1 / Transactions / new.И формы создаются с использованием form_for [@product, @transaction] do | f |Типы форматов.Примечание. Продукты и услуги слишком различаются по дизайну и функциональности, чтобы объединить их в один объект типа STI.

Мой вопрос: есть ли лучший способ сделать это без STI?И как лучше всего проверить в контроллере, чтобы определить тип объекта, на который нужно воздействовать?

IE в новом действии:

if ???
  @product = Product.find(params[:product_id])
  @transaction = @product.transactions.build
elsif ???
  @service = Service.find(params[:service_id])
  @transaction = @service.transactions.build
end

В связанной заметке кто-нибудь знаеткаких-нибудь учебных пособий, которые обсуждают дизайн корзины для Rails 3?Я видел несколько книг, но они используют сеансы для хранения всего объекта корзины, что, на мой взгляд, не очень безопасно.И другие слишком упрощены.

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 01 июня 2011

Я думаю, у вас есть два основных варианта:

(1) Создайте два типа / модели транзакций: product_transactions и service_transactions.Оба могут наследовать от общего модуля транзакций.Этот подход позволяет вам игнорировать вопрос о том, с какой транзакцией я имею дело?и сосредоточиться на общих деталях реализации в модуле транзакций.Затем вы можете поддерживать два более простых вложенных контроллера, /products/<id>/transactions и /services/<id>/transactions, которые не требуют проверки типов.

(2) Переместите проверку типов в общую модель транзакций.Этот подход предполагает, что взаимодействия между транзакцией и продуктом или услугой будут обрабатываться через модуль транзакции, поэтому вы не будете знать, с какой из них вы взаимодействуете.Например:

class Transaction
  belongs_to :service
  belongs_to :product

  def parent
    @parent ||= product || service
  end

  def call_some_action_on_parent
    parent.some_action
  end
end

Вы можете сделать что-то похожее в вашем контроллере:

@parent = params[:service_id].blank? ? Product.find(params[:product_id]) : Service.find(params[:service_id])
@transaction = @parent.transactions.build(params[:transaction])

Опция, которую вы выбираете, должна действительно быть решением, основанным на ваших потребностях, связанных с объектом транзакции.Если пользовательского кода много, в зависимости от того, взаимодействуете ли вы с продуктом или услугой, вы должны следовать первому подходу.Если код, по сути, одинаков, вам следует воспользоваться вторым подходом и сосредоточиться на контракте между транзакцией и ее родительским объектом (продуктом, услугой или другим) и игнорировать тип объекта.По сути, вас действительно интересует только то, реагирует ли родительский объект на конкретные методы, а не то, какой это на самом деле объект.Как правило, по возможности избегайте проверки типов и сосредоточьтесь на responseds_to?метод вместо.

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