2017-07-31 21 views
0

所以这里是我的问题:Rails-保存对象,其中一个字段不是来自于形式

我需要为一个订单创建一个标识符。我已经有了一个ID字段,但他们想根据创建订单的日期和时间创建一个标识符。

我创建了迁移,并添加了没有问题的标识符,但我需要在控制器创建方法中生成此标识符并保存顺序。类似这样的:

def create 
    identifier = generate_identifier 
    @order = Order.new(order_params, identifier) 
    if @order.save 
     OrderMailer.confirm_order_email(@order, current_user).deliver 
    else 
     flash[:errors] = @order.errors.full_messages 
     errors_user_logged? 
    end 
    end 

我该如何使用order_params和生成的标识符一起调用Order.new?

+4

使用'before_create'回调为order.rb文件中的每个订单生成标识符。检查此链接的详细信息:http://guides.rubyonrails.org/active_record_callbacks.html – Abhinay

回答

2

您可能想要将其移至模型图层。这似乎不是控制器的问题。您可以在模型中定义一个或两个方法,并使用before_create回调来执行此操作。它应该使测试更容易。

class Order < ActiveRecord::Base 
    before_create :set_identifier 

    private 

    def set_identifier 
    self.identifier = generate_identifier 
    end 

    def generate_identifier 
    # code to generate the identifier 
    end 
end 
0

如何将identifier插入params如下?

def create 
    params[:order][:identifier] = generate_identifier 
    @order = Order.new(order_params) 
    if @order.save 
    OrderMailer.confirm_order_email(@order, current_user).deliver 
    else 
    flash[:errors] = @order.errors.full_messages 
    errors_user_logged? 
    end 
end 


def order_params 
    params.require(:order).permit(:something, :something, :identifier) 
end 
+2

它会工作,但附加应用程序生成的值params不是一个好办法。如果你为了某些其他目的需要再次使用这个完整的参数,你将不得不删除或使用'.except'方法来忽略'identifier' – Abhinay

+1

感谢您的评论。我懂了 !正如你所说,我注意到直接改变参数并不好。 @Abhinay – Yujiro

相关问题