Ruby on rails 在rails中创建模型时如何预处理参数?
我有form和pass参数:Ruby on rails 在rails中创建模型时如何预处理参数?,ruby-on-rails,Ruby On Rails,我有form和pass参数: user_params = { first_name: "Bob", last_name: "A" } 我有一个用户模型,它有字段全名,名字,简称 所以当参数传递给控制器时,我调用: @user = User.create(user_params) 我想用全名=Bob A,first\u name=Bob,short\u name=“B.A”存储用户。可能吗?如果没有,转移参数的最佳地点是哪里在控制器中执行操作之前 关键问
user_params = { first_name: "Bob", last_name: "A" }
我有一个用户
模型,它有字段全名
,名字
,简称
所以当参数传递给控制器时,我调用:
@user = User.create(user_params)
我想用全名=Bob A,first\u name=Bob,short\u name=“B.A”存储用户。可能吗?如果没有,转移参数的最佳地点是哪里<代码>在控制器中执行操作之前
关键问题是表单参数的结构与数据库模式不同。因此需要进行转换。可能有不同的方法 在控制器内创建一个方法:
def prepared_user_params
user_params.merge(
full_name: "#{user_params[:first_name]} #{user_params[:short_name]}"
)
end
然后可以使用此方法@user=user.create(准备好的用户参数)
或者在用户
模型中使用回调
class User < ApplicationRecord
before_save :set_full_name
private
def set_full_name
self.full_name = "#{first_name} #{short_name}"
end
end
class用户
因此,在调用User.create(User_params)
、first_name
和first_name
获得分配后,全名
通过回调进行设置
此外,还可以使用一些服务类来完成所有准备工作。可能有不同的方法来完成 在控制器内创建一个方法:
def prepared_user_params
user_params.merge(
full_name: "#{user_params[:first_name]} #{user_params[:short_name]}"
)
end
然后可以使用此方法@user=user.create(准备好的用户参数)
或者在用户
模型中使用回调
class User < ApplicationRecord
before_save :set_full_name
private
def set_full_name
self.full_name = "#{first_name} #{short_name}"
end
end
class用户
因此,在调用User.create(User_params)
、first_name
和first_name
获得分配后,全名
通过回调进行设置
此外,还可以使用一些服务类来完成所有准备工作。我更喜欢将此逻辑提取到一个单独的类中。我称之为“参数对象”
#控制器
def创建
@user=user.create(ParamObjects::user::create.new(params.call)
...
结束
#param对象
模块参数对象::用户
类创建
def初始化(参数)
@params=params
结束
def呼叫
{
first_name:params[:first_name],
全名:计算全名,
短名称:计算短名称,
}
结束
私有的
属性读取器:参数
def compute_全名
...
结束
结束
结束
但是如果你想找一些更简单的东西,雅科夫列出了几个不错的选择。我更喜欢将这个逻辑提取到一个单独的类中。我称之为“参数对象”
#控制器
def创建
@user=user.create(ParamObjects::user::create.new(params.call)
...
结束
#param对象
模块参数对象::用户
类创建
def初始化(参数)
@params=params
结束
def呼叫
{
first_name:params[:first_name],
全名:计算全名,
短名称:计算短名称,
}
结束
私有的
属性读取器:参数
def compute_全名
...
结束
结束
结束
但是如果你想找更简单的东西,雅科夫列出了几个不错的选择。应该存储全名的目的是什么?你需要通过
全名搜索还是以某种方式使用它?@Yakov,没有目的,只是举个例子。在现实世界中,它不是全名。它表示一个基于表单参数数据创建的新字段。应存储全名
的目的是什么?你需要通过全名搜索还是以某种方式使用它?@Yakov,没有目的,只是举个例子。在现实世界中,它不是全名。它代表一个基于表单参数数据创建的新字段。imo更倾向于使用模型方法。感谢您的回答。使用set方法时,如何设置全名的验证方法
?例如,在保存前验证
的存在
可以被在验证
回调前替换。然后您可以对其应用任何验证。self.full\u name=[名字,简称]。拒绝(&:blank?)。加入(“”)
以使状态验证正常工作。imo更倾向于使用模型方法。谢谢您的回答。使用set方法时,如何设置全名的验证方法
?例如,在保存前验证
的存在
可以被在验证
回调前替换。然后您可以对其应用任何验证。self.full\u name=[名字,简称]。拒绝(&:blank?)。加入(“”)
以使状态验证正常工作。