将送货地址模型与订单模型关联Rails 4

时间:2015-04-09 16:47:43

标签: ruby-on-rails ruby-on-rails-4 model-associations

我正在尝试将送货地址与我的应用程序中的订单相关联,但无法找到执行此操作的好方法。

这是我的关联:

class ShippingAddress < ActiveRecord::Base
    belongs_to :order
end

class Order < ActiveRecord::Base
  has_one :shipping_address
end

我看到很多例子假设有一个current_user,但我正在尝试进行结帐流程,以便用户不必登录。

以下是我的送货地址控制器的样子:

class ShippingAddressesController < ApplicationController

    def new
        @shipping_address = ShippingAddress.new
    end

    def create
        @shipping_address = ShippingAddress.new(shipping_address_params)
            @shipping_address.save 
            redirect_to root_url
    end

    private

    def shipping_address_params
      params.require(:shipping_address).permit(:shipping_name, :address_line1, :address_line2, :address_city, 
        :address_state, :address_zip, :address_country, :user_id, :order_id)
    end
end 

这就是订单控制器的样子:

class OrdersController < ApplicationController

  def create
    @order = Order.find_or_initialize_by(item_id: params[:order][:item_id], order_completed: false, user_id: params[:order][:user_id])
    @order.update_attribute(:quantity_requested, params[:order][:quantity_requested])
    @order.save
    redirect_to @order
  end 
private 
  def order_params
    params.require(:order).permit(:user_id, :item_id, :quantity_requested, :quantity, 
      :order_completed, :sold, :shipping_address_id)
  end
end 

如果我正在考虑正确的方式以及如何让订单了解送货地址,有人可以告诉我吗?

如果我遗漏了一些明显的东西,请提前致谢并表示歉意。

1 个答案:

答案 0 :(得分:1)

不确定您是否确实需要:user_id参数。如果用户已登录,您可以通过current_user获取。如果没有,你永远不会知道他的身份。

当您按照order.create_shipping_addressShippingAddress.create order: order(或以您喜欢的任何其他方式填充shipping_addresses.order_id字段)时,订单会知道送货地址。然后,您可以使用order.shipping_addressshipping_address.order来查找相关对象。

此外,通常管理者(或网站)必须与客户沟通,至少发送一些有关订单状态的电子邮件,因此我不要求用户登录,但如果他没有登录,我会创建结帐时新的一个存储他的联系人(以及其他一些有用的东西:))