【问题标题】:How to remove model name from URL with friendly_id in ruby on rails如何在 ruby​​ on rails 中使用友好 ID 从 URL 中删除模型名称
【发布时间】:2014-01-06 16:44:21
【问题描述】:

我有一个允许用户添加问题的问题模型。

我已经设置了 Friendly_id,所以现在当用户添加问题时,网址是:

http://localhost:3000/questions/this-is-a-question

但是,我希望网址看起来像这样

http://localhost:3000/this-is-a-question

您对我如何使用friendly_id 做到这一点有任何想法吗?

谢谢

更新:

这是我有问题的friendly_id位。rb

extend FriendlyId
friendly_id :title, use: [:slugged, :finders]

def slug_candidates
[
  :title,
  [:title, :id]
]
end

def should_generate_new_friendly_id?
    new_record?
end 

结束

【问题讨论】:

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


    【解决方案1】:

    在 routes.rb 中

    resources :questions, path: ''
    

    在您注销时引发错误。

    试试:

    get '/:friendly_id', to: 'questions#show' 
    

    【讨论】:

      【解决方案2】:

      在 routes.rb 中试试这个

      resources :questions, path: ''
      

      【讨论】:

      • 没有错误,但“问题”仍在 URL 中。我有另一个资源,资源:问题做资源:答案结束。有什么想法吗?
      • 所以改变那里 - 资源:问题,路径:''做资源:答案结束
      • 再次您好,感谢您的回复。当有路由时,这会给出无路由错误...有没有办法在friendly_id 中执行此操作?还有其他想法吗?干杯
      • 你有没有直接在浏览器中尝试 url 'localhost:3000/this-is-a-question'
      • 我有一个错误!虽然这在用户登录时有效。当我尝试注销时,我收到错误:ActiveRecord::RecordNotFound on the line: def set_question ATquestion = Question.find(params[:id]) end
      【解决方案3】:

      在 routes.rb 中

      resources :questions, except: :show # Remove others you don't want
      
      get ':id', to: 'questions#show', as: 'question'
      

      如果您使用的是根级别 id,请确保使用 friendly_id 的保留字。此外,请确保将 get ':id', to: 'questions#show', as: 'question' 行保留在 routes.rb 的底部,以便其他所有内容都优先于它。这是一条危险的路线。

      【讨论】:

      • hmmm...我做了你所说的一切,但得到了这个错误。无效的路由名称,已在使用:'question' 您可能使用 :as 选项定义了两个同名的路由,或者您可能覆盖了已由同名资源定义的路由。对于后者,您可以限制使用“资源”创建的路由。在这一行:get ':title', to: 'questions#show', as: 'question'
      • 尝试将resources :questions 位注释掉一分钟,看看是否有帮助。当您设置路由as: 'question' 时,基本上是在告诉它覆盖question_path 路由。问题是它仍然认为resources :question, only: :show 仍然存在。
      • 感谢您的回复。试过了,还是不行!有没有其他方法可以做到这一点?也许在带有friendly_id的问题模型中?
      【解决方案4】:

      您想要的 routes.rb 类似于以下内容:

      get '/:id', to: 'posts#show', constraints: { id: /\d.+/ }
      get '/:username', to: 'users#show'
      

      复制自路由文档http://guides.rubyonrails.org/routing.html

      在您的情况下,如果问题名称称为friendly_id,那么您想要的是:

      get '/:friendly_id', to: 'questions#show'
      

      在您的controller show method 中,您将使用param[:friendly_id]

      【讨论】:

      • 您好,感谢您的回复。我将该行添加到我的 routes.rb 并且它起作用了我没有更改控制器,因为更改时它失败了。但是,这一行并没有改变 URL,“问题”仍然存在。有什么想法吗?
      • @LewisFrost,我已经对此进行了测试,它在类似的情况下也可以工作,您需要直接在浏览器中尝试 URL,然后将参数记录到控制器中的控制台(logger.info params)所以查看您收到的参数,如果您在浏览器中尝试此操作http://localhost:3000/this-is-a-question,那么您的questions#show 应该会收到[:friendly_id => "this-is-a-question"],您可能还需要在使用我指定的路线后发布一些日志
      猜你喜欢
      • 1970-01-01
      • 2013-11-07
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多