【问题标题】:Why is Friendly_ID gem using slug instead of primary key?为什么 Friendly_ID gem 使用 slug 而不是主键?
【发布时间】:2014-11-20 12:24:54
【问题描述】:

安装 Friendly_ID 后,我从 rails 收到错误,因为代码误解了输入,我不知道如何解决该问题。为了让 MVC 框架能够理解 url 并相应地对其进行路由,url 需要符合以下模式:

localhost:3000/posts/[:id]

在上面,[id] 表示在 Post 模型类中找到的任何对象的主键。当 Friendly_ID 更改 url 以适应以下模式时,误解就会生效:

localhost:3000/posts/[:slug]

更新后的 url 显然更容易被用户阅读,但由于我的应用程序希望获得 [:id],因此它会为 url “localhost:3000/posts/testing”引发以下异常:


我曾假设 Friendly_ID gem 会在内部处理路由问题,执行某种[:id] 查找,或者通过某种 url-masking 发挥它的魔力。由于在这种情况下以上都不是真的,我该如何解决这个问题,让漂亮的 url 提供与原始 url 模式相同的结果?

【问题讨论】:

    标签: ruby-on-rails friendly-url friendly-id


    【解决方案1】:

    将config.use :finders 添加到您的config/initializers/friendly_id.rb

    这是我的样子:

    FriendlyId.defaults do |config|
      config.use :reserved
    
      config.reserved_words = %w(new edit index session login logout users admin
        stylesheets assets javascripts images)
    
      config.use :finders
    end
    

    【讨论】:

    • 我刚刚检查了我的初始化程序目录,但那里没有那个文件。应该吗?
    • 它设置了默认配置。如果你只对一个班级使用友好的 id,你就不需要它。但是如果你将它用于多个类,最好将配置保存在一个地方。
    【解决方案2】:

    从 gem 版本 5.0 开始禁用 Finder 覆盖

    使用Post.friendly.find(params[:id])或降级,或使用finder插件,见project github page

    【讨论】:

    • 效果很好!但是有没有一种直观的方法可以让 Rails 接受任一 url 模式?
    • @elersong 你可以做那件事 -friendly_id :foo, 使用: [:slugged, :finders] 请参考项目 github 页面
    • github 页面没有提到该代码应该去哪里。我应该把它放在哪里?
    • @elersong 此代码进入您的 Post 模型。不是已经有了,只是没有后半部分?
    • 放在app/models/post.rb的顶部。现在你应该有friendly_id :foo, use: :slugged
    猜你喜欢
    • 2015-07-30
    • 2018-03-22
    • 2015-12-27
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 2018-07-15
    相关资源
    最近更新 更多