gpt4 book ai didi

ruby-on-rails - 如何使用 rails 4 中 Controller 内部生成的变量覆盖创建操作

转载 作者:行者123 更新时间:2023-12-04 05:46:14 25 4
gpt4 key购买 nike

这是我在 Payments Controller 的创建操作中编写的代码。

user_id=Performer.find_by_first_name(params[:payment][:first_name]).user.id
email=Performer.find_by_first_name(params[:payment][:first_name]).user.email
@payment = Payment.new(user_id,params[:payment][:desc],params[:payment][:amount],email,params[:first_name])
#@payment = Payment.new(payment_params)

当我尝试这样做时,出现以下错误:

wrong number of arguments (5 for 0..1)

我不能就这样传递值,所以我需要在将其保存到表中之前更改它们。我该怎么做?

最佳答案

它只接受属性的散列:

@payment = Payment.new(
user_id: user_id,
desc: params[:payment][:desc],
amount: params[:payment][:amount],
email: email,
first_name: params[:first_name]
)

由于您使用的是 Rails 4,我鼓励您看一下 strong_parameters .

在将值保存到数据库之前更改值

您可以使用 before_save 回调或定义自定义访问器。

1。使用 before_save 回调:

如果您想在将值保存到数据库之前更改它们,您可以使用 before_save 回调:

class Payment < ActiveRecord::Base
before_save :change_values

private

def change_values
self.amount = amount.do_something
# etc.
end
end

API 文档:

2。使用自定义访问器:

或者您可以定义自定义访问器:

2.1 使用read_attributewrite_attribute

def amount=(dollars)
write_attribute :amount, dollars.do_something
end

def amount
read_attribute(:amount).do_something
end

API 文档:

2.2 具有虚拟属性:

def amount_in_dollars
amount.do_something
end

def amount_in_dollars=(dollars)
self.amount = dollars.do_something
end

Railscasts:

关于ruby-on-rails - 如何使用 rails 4 中 Controller 内部生成的变量覆盖创建操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19180207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com