如何模糊网址中的id(ruby on rails)

Mar*_*ard 1 ruby-on-rails url-shortener

我有一个使用Ruby On Rails创建的Web应用程序.现在,当我想显示一个对象时,我必须访问以下页面:http://mywebapp.com/object/1234,其中1234是对象的id.

我想编码该对象ID并具有以下结果:http://mywebapp.com/object/5k(这只是一个例子).

怎么做到呢?

非常感谢,
马丁

ben*_*der 5

所有这些转换方法都是可逆的,所以恕我直言,如果你的对象有一些名称或标题或其他什么,那么最好的方法是添加一个slug.在这种情况下,添加一个新属性:slug到你的对象,让它自动从模型上的对象名(或其他东西)生成它的值:

class MyObject

  validates_format_of :slug, :with => /\A[a-z\-0-9]*\Z/
  before_validation :generate_slug, :on => :create    

  def generate_slug
    if self.slug.blank?
      slug = self.name.mb_chars.downcase.normalize(:kd).to_s.gsub(/-/, " ").squeeze(" ")
      slug = slug.gsub(/\s/, "-").gsub(/[^a-z\-0-9]/, "")

      current = 1
      self.slug = slug
      while true
        conflicts = MyObject.where("slug = ?", self.slug).count
        if conflicts != 0
          self.slug = "#{slug}-#{current}"
          current += 1
        else
          break
        end
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后URL可以是http://mywebapp.com/object/my_object_slug,因为在行动中你可以通过这个slug找到对象:

class MyObjectController

  def some_action
    my_object = MyObject.find_by_slug(params[:slug])

    ...

  end
end
Run Code Online (Sandbox Code Playgroud)

不要忘记修改routes.rb:

match "object/:slug", :to => "my_objects#some_action"
Run Code Online (Sandbox Code Playgroud)