2013-11-21 21 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。我认为切割是危险的。但是,也许你并不是说要丢失这些信息。 –