【问题标题】:Update params or redirect to correct URL rails更新参数或重定向到正确的 URL rails
【发布时间】:2021-11-21 20:29:31
【问题描述】:

对 Rails 比较陌生,因此无法找到解决此问题的方法。

目前有一条路线:/test/testing/:id 一旦用户点击路由,它将在数据库中找到具有该特定 ID 的项目并将 URL 设置为 localhost:3000/test/testing/1-name-of-this-item

但是,如果您只是手动输入该 URL,例如:localhost:3000/test/testing/1,我希望它重定向到 /test/testing/1-name-of-this-item,或者如果有某种方法可以在页面加载之前更改参数。但不完全确定如何执行此操作。

感谢您的帮助!

【问题讨论】:

  • 如何在代码中将 URL 设置为 /test/testing/1-name-of-this-item?您能否详细说明为什么设置该新 URL 适用于您的第二段的用例,但不适用于第三段的用例,这两个 GET 请求之间有什么区别?
  • @spickermann 目前有一个包含所有项目的表格,项目标题上有一个link_to,点击它会设置URL,然后发送到我的显示操作,它查询项目。例如,如果用户以某种方式仅使用 id (/test/testing/1) 输入 URL,它仍然会加载我想要的功能的页面,如果 id(integer) 刚刚传入,页面将重定向到项目的整数和名称(test/testing/1-name-of-this-item)

标签: ruby-on-rails ruby


【解决方案1】:

你可以尝试两种方法来处理这个

1: 使用以下 Gem,它将根据您想要的属性构造 URL https://github.com/norman/friendly_id

2:覆盖模型中的 to_param 方法并传递您希望在 URL 路径中显示的属性

https://apidock.com/rails/ActiveRecord/Base/to_param

【讨论】:

    【解决方案2】:

    根据您上面的评论,我假设您有一个 Testing 模型,其中至少有一个名为 id 的列和一个名为 path 的列。因为您没有提到路径是如何生成的,所以我将假设该列已预先填充并返回像 1-name-of-this-item 这样的 slug,并且路径前缀的数字始终与记录的 id 同步。

    此外,我猜你的路由设置正确,/test 是一个命名空间,/testing 被定义为一个普通的resources :testing。这让我假设像 test_testing_path 这样的 path_helper 是由 Rails 生成的。

    如果是这种情况,那么只需将您的 show 控制器方法更改为这样就足够了:

    def show
      @testing = Testing.find(params[:id])
      
      if @testing.path != params[:id]
        redirect_to test_testing_path(@testing.path)
      else
        respond_to do |format|
          format.html # show.html.erb
          format.json { render json: @testing }
        end
      end
    end
    

    【讨论】:

      【解决方案3】:

      我想通了;有一个叫做 refraction 的 gem,它是一个中间件,允许您在 URL 被应用程序处理之前更改它,效果很好。

      https://github.com/joshsusser/refraction

      【讨论】:

        猜你喜欢
        • 2013-05-31
        • 2012-10-15
        • 2013-05-18
        • 2016-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-27
        • 2023-03-17
        相关资源
        最近更新 更多