Ruby on rails 在rails中创建模型时如何预处理参数?

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”存储用户。可能吗?如果没有,转移参数的最佳地点是哪里在控制器中执行操作之前 关键问

我有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”存储用户。可能吗?如果没有,转移参数的最佳地点是哪里<代码>在控制器中执行操作之前


关键问题是表单参数的结构与数据库模式不同。因此需要进行转换。

可能有不同的方法

在控制器内创建一个方法:

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?)。加入(“”)
以使状态验证正常工作。