同时创建新注册和新订单

时间:2016-01-02 18:09:40

标签: ruby-on-rails

我正在尝试将事件注册添加到当前或新订单中。 帖子末尾的问题。

活动模型:包含标题,日期,说明等基本活动信息。此事件模型有许多事件选项。

活动选项:包含说明和价格。此事件选项有许多注册。

注册:允许用户注册,并从事件选项价格中获取价格。此注册属于事件选项和订单模型。

订单:根据与其关联的所有注册的总和计算订单总数。

创建新注册 在事件选项显示页面中,我有一个使用remote:true。

创建新注册的表单

以下表格:

<%= form_for(@registration, remote: true) do |f| %>
  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :lastname %><br>
    <%= f.text_field :lastname %>
  </div>
  <div class="field">
    <%= f.label :event_option_id %><br>
    <%= f.text_field :event_option_id, value: @event_option.id  %>
  </div>
  <div class="field">
    <%= f.label :order_item_id %><br>
    <%= f.text_field :order_item_id%>
  </div>
  <div class="field">
    <%= f.label :price %><br>
    <%= f.text_field :price, value: @event_option.price%>
  </div>  
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

提交表单时,它会创建事件,如果订单不存在,还会创建新订单。要创建新订单,我在应用程序控制器中有这个帮助方法:

  def current_order
    if !session[:order_id].nil?
      Order.find(session[:order_id])
    else
      Order.new
    end
  end

这是注册控制器中的create方法:

  def create
    @order = current_order
    @registration = Registration.new(registration_params)
    @order_id = current_order.id

    respond_to do |format|
      if @registration.save
        format.html { redirect_to @registration, notice: 'Registration was successfully created.' }
        format.json { render :show, status: :created, location: @registration }
        format.js {}
        @order.save
        session[:order_id] = @order.id
      else
        format.html { render :new }
        format.json { render json: @registration.errors, status: :unprocessable_entity }
      end
    end
  end

问题在于我无法在订单中添加注册。我猜这是因为注册是在订单之前创建的。 response_to块中if @ registration.save的最后两行正在保存订单。如何在订单中添加注册?是否可以同时创建新注册和新订单?

1 个答案:

答案 0 :(得分:2)

解决此问题的一种简单方法是在保存订单之前将订单分配给订单...

@order.registrations << @registration
@order.save

或者,您可以在创建@registration记录时创建关联。

而不是......

@registration = Registration.new(registration_params)

...做

@registration = @order.registrations.build(registration_params)