2013-11-21 44 views
2

我必須創建一個包含http鏈接的字段,以便在Rails模型中是唯一的。除此之外,我想拒絕鏈接變化以及像:如何使用Rails創建複雜的獨特性?

  • 如果我嘗試插入一個http ■當HTTP地址存在
  • 如果我嘗試插入帶有參數的鏈接地址當有

我發現這種聯繫可能表明我的問題的答案,而無需參數或不同的另一個鏈接,但我希望我可以直接在我的情況下,不隨時間改變指數做到這一點經過。

In Rails, How do I validates_uniqueness_of :field with a scope of last 6 months

沒有必要提供確切的答案,因爲我有一個正則表達式的一些經驗。一個不同的例子,或者已經是基準將是美好的,因爲我couln't找不着

+2

你可能要考慮創建一個鏈接模式,具有像「協議」(http/https),「端口」(80/43),「url」,「params」等屬性,然後驗證url的唯一性(不包括params和協議) – MrYoshiji

+0

@ MrYoshiji先生,看起來很有趣。你不想爲此創建答案嗎? –

+0

只是,它不完整,但給你一個鏈接模型的基礎 – MrYoshiji

回答

2

像這樣的東西可以給你的第一個步驟:

require 'uri' 

class Link < ActiveRecord::Base 
    attr_accessor :link 

    validate :check_link_integrity 
    validates :url, uniqueness: true 
    before_save :parse_link 

    def check_link_integrity 
    begin 
     URI::parse(self[:link]) 
     return true 
    rescue URI::InvalidURIError => e 
     return false 
    end 
    end 

    def parse_link 
    uri_link = URI::parse(self.attributes.delete(:link)) 
    self.url = uri_link.host + uri_link.path 
    self.protocol = uri_link.scheme 
    self.parameters = uri_link.query 
    end 

    def to_s 
    "#{protocol}://#{url}?#{parameters}" 
    end 

end 

URI模塊文檔:http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI.html

+0

謝謝!我還沒有嘗試,但它似乎非常好! –

+0

對不起,延誤了......我正在解決我應用程序中的其他問題......我在最近幾天嘗試了它,並開始將「self.attributes.delete(:link)」替換爲「self.link」但編輯視圖不顯示當前鏈接。難道我做錯了什麼?解決類似問題的任何資源都將有所幫助,因爲我找不到任何資源。謝謝! –

+1

今天我有一個想法,似乎工作,雖然它可能不是最好的解決方案。我剪下了before_save,在parse_link中包含了一個param,使用它的鏈接「uri_link = URI :: parse(param_link」,在控制器中調用params [:link] [:link]作爲參數,並將to_s重命名爲鏈接 –

1

你可以做到這一點與使用URI模塊自定義驗證方法

所有你需要的是 URI = URI(YOUR_URL) 然後基本檢查是否有與uri.host和uri.path相同的另一條記錄。

是的,這不是一種欄杆的方式,這將需要對每次驗證進行計算,但是您的請求並不簡單。

另一種方法是隻在數據庫中存儲主機名+路徑(意思是:在保存過程中從URL中刪除協議和參數)。這樣,您就可以使用內置的uniqness檢查機制

+0

謝謝!我不知道URI。我認爲切割是危險的。但是,也許你並不是說要丟失這些信息。 –