在 rails 上保存 current_user 设计 ruby 的电子邮件数据。创建订单时

Save current_user email data from devise ruby on rails. When creating a Order

感谢您抽出时间来帮助我。

我希望能够在客户创建新订单时保存 current_user 设计数据。按照我能找到的所有内容,我设法让 user_id 保存但不是我需要的东西,比如电子邮件。我会密切关注这个 post.

为澄清起见,我需要在提交表单时保存帐户数据,以避免用户再次添加数据,如姓名电子邮件等。此数据已保存在设计用户帐户中。所以我想用提交的表格提交。

我在orders_controller.rb

看到过这样的事情
def create
  @order = current_user
end

但它根本不保存任何数据。当我在 post 的底部执行此操作时,您可以看到控制台输出。为零。

型号:

User.rb

    class User < ActiveRecord::Base
      has_many :orders
      # Include default devise modules. Others available are:
      # , :lockable, :timeoutable and :omniauthable , :registerable
      devise :database_authenticatable,
             :recoverable, :rememberable, :trackable, :validatable, :confirmable
      attr_accessor :email
    end

order.rb

    class Order < ActiveRecord::Base
      belongs_to :user
      attr_accessor :email
    end

控制器:

orders_controller.rb

    class OrdersController < ApplicationController
      before_filter :authenticate_user!
      def new
        @order = Order.new
      end

      def create
        @order = Order.new(order_params)
        @order = current_user.orders.new(params[:email])
        if @order.save
          redirect_to dconfirmation_path
        end
      end

      def order_params
        params.require(:order).
          permit(
            :email,
            :delivery_name,
            :company_name,
            :delivery_address1,
            :delivery_address2,
            :delivery_address3,
            :delivery_city,
            :delivery_postcode,
            :delivery_country,
            :phone,
            :package_contents,
            :description_content,
            :restricted_items,
            :terms_conditions,
            :insurance,
            :contents_value,
            :cf_reference,
            :reference_number
            )
      end
      def show
        @user = User.find(params[:id])
      end

      def confirmation
      end

    end

现在所有字段都保存在表单中,user_id 很好,但我需要能够通过电子邮件显示订单创建者。如果我转到控制台并执行 Order.Last 这是保存的数据,例如:

      Order Load (0.6ms)  SELECT  "orders".* FROM "orders"  ORDER BY "orders"."id" DESC LIMIT 1
    => #<Order id: 13, delivery_name: nil, company_name: nil, delivery_address1: nil, delivery_address2: nil, delivery_address3: nil, delivery_city: nil, delivery_postcode: nil, delivery_country: nil, phone: nil, package_contents: nil, description_content: nil, restricted_items: nil, terms_conditions: nil, insurance: nil, contents_value: nil, cf_reference: nil, reference_number: nil, created_at: "2015-06-30 20:54:22", updated_at: "2015-06-30 20:54:22", user_id: 2, name: nil, address_line_1: nil, address_line_2: nil, postcode: nil, city: nil, country: nil, email: nil>

我当然不想要

email: nil>

为零 current_user 有一封分配给该帐户的电子邮件,我想将其保存在那里

-可选数据 ?

迁移:

20150630090050_add_user_id_to_orders.rb

class AddUserIdToOrders < ActiveRecord::Migration
  def change
    add_column :orders, :user_id, :integer
    add_column :orders, :name, :string
    add_column :orders, :address_line_1, :string
    add_column :orders, :address_line_2, :string
    add_column :orders, :postcode, :string
    add_column :orders, :city, :string
    add_column :orders, :country, :string
  end
end

add_email_to_orders.rb

class AddEmailToOrders < ActiveRecord::Migration
  def change
    add_column :orders, :email, :string
  end
end

ps。我将提供所需的任何其他详细信息。

理想情况下,您不会将电子邮件存储在订单中,但如果必须,您可以通过简单的赋值来完成

    @order = current_user.orders.new(order_params)
    @order.email = current_user.email
    if @order.save

请注意,您有两行 @order =...。那行不通,第二个完全取代了第一个。我上面的建议都将 current_user.id 分配给 @order 以及表单参数。

如果您选择将电子邮件存储在订单记录中,那么您可以使用my_order.user.email检索订单的电子邮件,或者...

class Order < ActiveRecord::Base
  belongs_to :user
  delegate :email, to: :user
  ...
end.

哪个会让你做...

my_order.email

...不需要 Order 模型中的属性。

..