关于humanize
(可能titleize
我也不确定)的问题是,如果字符串是nil
,它会破坏视图。
然后你将不得不.try(:humanize)
,如果你意识到你犯了那么多错误并且你必须在你的观点中重新检查每一行代码,那将是一件非常令人头痛的问题。
我正在寻找的是在将它们存储到数据库之前我可以humanize
和titleize
字符串的方式。这样,即使我直视我的数据库,我也会看到字符串humanize
d和titleize
d。
答案 0 :(得分:2)
您可以在模型中创建一个方法,该方法将获取此属性,并根据需要和/或您需要进行转换,每次使用它作为{{1保存记录时,您都可以“触发”此方法回调:
例如,拥有一个模型before_save
属性User
和name
我正在使用lastname
并使用name
:
titleize
params将包含用户键入的属性,但它们将根据模型的说明保存:
class User < ApplicationRecord
before_save :titlelize_names
def titlelize_names
self.name = self.name.titleize
end
end
在保存记录之前,您是唯一需要进行的交互,视图是不受影响的,控制器只是接收它并生成模型所说的内容。
如果通过任何更改,在保存记录时出现了一些问题,您可以使用Processing by UsersController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "user"=>{"name"=>"name", "lastname"=>"lastname"}, "commit"=>"Create User"}
(0.1ms) begin transaction
SQL (0.8ms) INSERT INTO "users" ("name", "lastname", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["name", "Name"], ["lastname", "lastname"]...]
和“强制停止”回调链。
throw(:abort)
此外,根据您使用def titlelize_names
self.name = self.name.titleize
throw(:abort)
end
回调的方法,您可以添加可在控制器中使用的自定义错误,例如,由密钥{{标识的错误然后可以在控制器中处理1}}。
before_save
答案 1 :(得分:0)
在将数据保存到数据库之前,您可以使用模型回调来转换数据:http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html - 您可能需要before_save
。
此外,如果您想确保记录永远不会为零,请同时添加验证。
示例:
class Example < ActiveRecord::Base
validates :name, presence: true
before_save :fixname
# Force titleize on :name attribute
def fixname
self.name = self.name.titleize
end
end
现在,您的模型将有一个名为fixname
的方法,您可以在模型实例的任何位置调用它,并在将其保存到数据库之前调用它。
答案 2 :(得分:0)
如果value为nil,humanize
和titlerize
会返回异常,请创建if语句,并且可以使用before_save
或{在一个服务或一个函数模型中创建此过程{1}}回调:
before_create