2017-05-09 52 views
0

關於humanize(也可能titleize我也不確定)的問題是它打破瞭如果字符串是nil視圖。 ,然後您必須改爲.try(:humanize),如果您意識到自己犯了錯誤的方式太晚,並且必須在視圖中重新檢查每行代碼,這會非常令人頭疼。 我正在尋找的是一種方式,我可以humanizetitleize字符串存儲到數據庫之前。這樣,即使我直視我的數據庫,我會看到字符串humanize d和titleize d。有沒有一種方法來標記和人性化字符串之前存儲到數據庫中

回答

2

你可以在您的模型中創建一個方法,該方法將採用此屬性並根據需要和/或您需要進行轉換。每當使用該方法存儲記錄時,您都可以「觸發」該方法before_save回調:

例如,有一個型號User哪些屬性namelastname我使用name並在其上使用titleize

class User < ApplicationRecord 
    before_save :titlelize_names 

    def titlelize_names 
    self.name = self.name.titleize 
    end 
end 

】這個params要包含的屬性爲用戶鍵入他們,但他們將被保存根據模型說的話:

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 

此外,並根據哪種方法你使用與before_save回調,您可以添加,這將提供給你的控制器中使用,如例如自定義錯誤,在關鍵:titleize_names識別的錯誤可能然後在控制器中處理。

def titlelize_names 
    errors.add(:titleize_names, 'An error has ocurred with the name attribute.') 
    self.name = self.name.titleize 
    throw(:abort) 
end 
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,你可以和任何地方調用你的模型實例具有它保存到數據庫之前調用。

0

如果humanize如果值是零titlerize返回例外,if語句創建一個,你可以在一個服務使這個過程或一個函數模型使用before_savebefore_create回調:

value.titleize unless value.nil? 
+2

控制器可能不是在將模型實例保存到數據庫之前操作模型實例的最佳位置。 – ddubs

+0

那,你說得對。我不知道我爲什麼這麼說。正在編輯... –

相關問題