在存储到数据库之前是否有一种标记和字符串标记的rails方法

时间:2017-05-09 14:33:34

标签: ruby ruby-on-rails-4

关于humanize(可能titleize我也不确定)的问题是,如果字符串是nil,它会破坏视图。 然后你将不得不.try(:humanize),如果你意识到你犯了那么多错误并且你必须在你的观点中重新检查每一行代码,那将是一件非常令人头痛的问题。 我正在寻找的是在将它们存储到数据库之前我可以humanizetitleize字符串的方式。这样,即使我直视我的数据库,我也会看到字符串humanize d和titleize d。

3 个答案:

答案 0 :(得分:2)

您可以在模型中创建一个方法,该方法将获取此属性,并根据需要和/或您需要进行转换,每次使用它作为{{1保存记录时,您都可以“触发”此方法回调:

例如,拥有一个模型before_save属性Username我正在使用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,humanizetitlerize会返回异常,请创建if语句,并且可以使用before_save或{在一个服务或一个函数模型中创建此过程{1}}回调:

before_create