Rails: структурирование арендных заказов и форма заказа в электронной коммерции - PullRequest
1 голос
/ 25 сентября 2019

Мне было интересно, может ли кто-нибудь помочь мне с приложением, имеющим некоторые особенности электронной коммерции.

Контекст: Через приложение сеть магазинов велосипедов («цепочки») может сдавать в аренду

  • велосипеды (' велосипеды '),
  • путем выбора типа велосипеда, такого как горный велосипед, городской велосипед и т. Д. (' bike_types ) и
  • опции велосипеда, такие как шлемы и т. Д. (' bike_options ')
  • , которые зависят от отдельного магазина велосипедов (' bike_stores ')
  • , эта аренда велосипедов и опции будут зафиксированы взаказ (' orders ')
  • соотношение между заказами и байками много-много, поэтому я создал таблицу для этого (' order_bikes ')

Заключительные примечания:

  • Перед арендой владелец сети сначала создал его / ее (i) bike_stores, (ii) bike_types, (iii) велосипеды и (iv) bike_options , эта часть приложения работает.Поэтому ему / ей нужно только выбрать bike_types / bikes / options из существующего ранее созданного инвентаря.
  • Я ограничиваю сферу вопроса, пропуская bike_options, это было главным образом для обеспечения некоторого контекста в порядкечтобы понять схему создания базы данных.

Сообщение об ошибке: Недопустимый параметр:: bike_id

Код:

* модели 1053 *

class Order < ApplicationRecord
  belongs_to :bike_store
  has_many :bike_types, through: :bike_store
  has_many :order_bikes, inverse_of: :order, dependent: :destroy
  accepts_nested_attributes_for :order_bikes, allow_destroy: true
end


class OrderBike < ApplicationRecord
  belongs_to :bike
  belongs_to :order
  accepts_nested_attributes_for :bike
end


class Bike < ApplicationRecord
  belongs_to :bike_type
  validates :name, presence: true
  has_many :order_bikes
  has_many :orders, through: :order_bikes
end


class BikeType < ApplicationRecord
  belongs_to :bike_store
  has_many :bikes, dependent: :destroy
  accepts_nested_attributes_for :bikes, allow_destroy: true
  has_many :bike_options, dependent: :destroy
  accepts_nested_attributes_for :bike_options, allow_destroy: true
  validates :name, :bike_count, presence: true
end

class BikeStore < ApplicationRecord
  has_many :bike_types, dependent: :destroy
  has_many :orders, dependent: :destroy
end

Контроллер заказа

class OrdersController < ApplicationController

  def new
    @bike_store = BikeStore.find(params[:bike_store_id])
    @order = Order.new
    @order.order_bikes.build
    @bike_type_list = @bike_store.bike_types
  end

  def create
    @order = Order.new(order_params)
    @bike_store = BikeStore.find(params[:bike_store_id])
    @order.bike_store = @bike_store
    @order.save
    redirect_to root_path
  end

private
  def order_params
    params.require(:order).permit(:arrival, :departure,
      order_bikes_attributes: [:id, :bike_quantity, :_destroy,
        bikes_attributes: [:id, :name,
          bike_types_attributes: [:id, :name]]])
  end
end

просмотр

<%= simple_form_for [@bike_store, @order] do |f|%>

<%= f.simple_fields_for :order_bikes do |order_bike| %>
  <%= order_bike.input :bike_quantity %>
  <%= order_bike.association :bike %>
<% end %>

 <%= f.input :arrival %>
 <%= f.input :departure %>
 <%= f.submit %>
<% end %>

1 Ответ

2 голосов
/ 25 сентября 2019

Если вы проверяете coed из простой формы здесь , вы увидите, что на самом деле делает ассоциация метода.

def association(association, options = {}, &block)
  # ... simple form code here ...
  attribute = build_association_attribute(reflection, association, options)

  input(attribute, options.merge(reflection: reflection))
end

Нас интересует build_association_attribute вызов метода. здесь

def build_association_attribute(reflection, association, options)
  case reflection.macro
  when :belongs_to
    (reflection.respond_to?(:options) && reflection.options[:foreign_key]) || :"#{reflection.name}_id"
    # ... the rest of code ...
  end
end

Ваша модель велосипеда заказа имеет ассоциацию belongs_to :bike.Поэтому, когда вы вызываете order_bike.association :bike, он создает атрибут :bike_id в вашей форме.Если вы проверите params хеш, который приходит к вашему контроллеру, я думаю, вы увидите, что этот атрибут исходит из вашего представления.

Я добавил bike_id к разрешенным параметрам.Я надеюсь, что это решит вашу проблему ..

def order_params
  params.require(:order).permit(:arrival, :departure,
    order_bikes_attributes: [:id, :bike_id, :bike_quantity, :_destroy,
      bikes_attributes: [:id, :name,
        bike_types_attributes: [:id, :name]]])
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...