Ruby on rails 我可以在Rails模型上使用友好Id,而不必在模型表上创建slug列吗?

Ruby on rails 我可以在Rails模型上使用友好Id,而不必在模型表上创建slug列吗?,ruby-on-rails,friendly-id,Ruby On Rails,Friendly Id,在Rails4.2上,我想使用它来路由到特定的模型,但不想在模型表上创建slug列。相反,我更喜欢在模型上使用访问器方法并动态生成slug。这可能吗?我在地图上找不到这个 您不能直接使用友好id执行此操作,因为它使用slug查询数据库()的方式 然而,实现你想要的并不困难。您需要两种方法: Model#slug方法,该方法将为特定模型提供slug Model.find\u by_slug方法,该方法将生成特定slug的相关查询 现在,在控制器中,您可以使用模型。通过_slug查找从路径参数获取相

在Rails4.2上,我想使用它来路由到特定的模型,但不想在模型表上创建slug列。相反,我更喜欢在模型上使用访问器方法并动态生成slug。这可能吗?我在地图上找不到这个

您不能直接使用友好id执行此操作,因为它使用slug查询数据库()的方式

然而,实现你想要的并不困难。您需要两种方法:

  • Model#slug
    方法,该方法将为特定模型提供slug
  • Model.find\u by_slug
    方法,该方法将生成特定slug的相关查询 现在,在控制器中,您可以使用
    模型。通过_slug查找
    从路径参数获取相关模型。然而,实现这种方法可能会很棘手,特别是如果您的
    模型#slug
    使用了不可逆的slug实现,比如,因为它只是获取文本中无法识别的字符的RID,并将多个内容规范化为同一个字符(例如u和-to-)

    您可以使用
    URI::Escape.encode
    URI::Escape.decode
    ,但最终会出现一些难看的段塞。

    如前所述,我使用以下基于动态段塞的自定义路由方法

    我想要这样的自定义路由:
    /foos/the-title-parameterized-1
    (其中“
    1
    ”是
    Foo
    对象的
    id

    Foo
    型号:

    #...
    attr_accessor :slug
    #dynamically generate a slug, the Rails `parameterize` 
    #handles transforming of ugly url characters such as 
    #unicode or spaces:
    def slug
      "#{self.title.parameterize[0..200]}-#{self.id}"
    end
    def to_param
      slug
    end 
    #...
    
    routes.rb

    get 'foos/:slug' => 'foos#show', :as => 'foo'
    
    def show
      @foo = Foo.find params[:slug].split("-").last.to_i
    end 
    
    foos\u controller.rb

    get 'foos/:slug' => 'foos#show', :as => 'foo'
    
    def show
      @foo = Foo.find params[:slug].split("-").last.to_i
    end 
    

    在我的
    show
    视图中,我可以使用默认的url帮助器方法
    foo\u path

    如果您必须在Ruby中动态计算“slug”,这意味着您无法根据slug查询记录。你必须把所有的东西都拿出来,用ruby进行分类。您想要的很可能是创建slug的自定义方法。感谢@max,我怀疑这一点,这就是为什么我问了另一个与创建创建slug的自定义方法相关的问题: