繁体   English   中英

从rails上保存来自ruby的current_user电子邮件数据。 创建订单时

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

感谢您抽出宝贵时间为我提供帮助。

当客户创建新订单时,我希望能够保存current_user设计数据。 我可以找到所有内容,然后设法保存了user_id,但没有保存我需要的东西,例如电子邮件。 我将密切关注这篇文章。

为了澄清起见,我需要在提交表单时保存帐户数据,以避免让用户再次添加数据(如电子邮件名)。 此数据已保存在devise用户帐户上。 所以我想用那是提交的形式提交。

我在orders_controller.rb中看到了这样的事情

def create
  @order = current_user
end

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

楷模:

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模型中的属性。

..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM