【问题标题】:Rails custom routing not keeping URL'sRails 自定义路由不保留 URL
【发布时间】:2014-02-07 02:32:14
【问题描述】:

我正在尝试向我的应用程序添加自定义路由,但首先要保持简单。

我希望得到一个像这样的网址:

/画廊/假期/美国/加利福尼亚

'holiday'、'america' 和 'california' 都是我的 Collection 模型的一个实例。

目前,我还没有实现在 URL 中使用的 slug,所以目前 URL 需要:

/gallery/594/595/597

每个数字都是集合的 id。

现在,我已将以下路由添加到我的路由文件中:

get '/gallery/*path' => 'Gallery#splitUrl'

当前对应的动作是:

  def splitUrl
    path_parts = params[:path].split('/')

    puts path_parts[1]

    # Deal with last item of the URL
    last_item = path_parts.last

    redirect_to Collection.find(last_item) if (Collection.find_by_id(last_item))
  end

到目前为止,我知道它是基本的,但只是从实施它开始。它正在重定向到适当的集合。在上面的代码中,它会将我带到 id 为 597 的集合,但是当它这样做时,地址栏中的 URL 将更改为 /collections/597。我怎样才能让它保持 /gallery/594/595/597 风格?

在构建我的应用程序结束时,图库网址应如下所示:

/gallery/holidays/america/california/day1/

尚未决定是否将单张照片实际放在它自己的页面上,但如果我这样做了,那么它需要位于网址的末尾。

我有几个模型供画廊使用:

集合 专辑 照片 照片尺寸

收藏可以包含其他收藏或专辑,但不能同时包含两者。

我认为我没有以正确的方式解决这个问题,但只是看不出解决这个问题的正确方法是什么。

我也不希望 /collections/ URL 正常工作,因为我希望人们必须通过完整的 URL 才能访问它们。

我已经尝试告诉 splitUrl 方法渲染集合#show 模板并创建了它需要的实例变量,但模板的渲染失败,因为模板包含的部分无法定位,而且我的一些样式基于控制器名称和操作失败,因为新控制器和操作现在是画廊和 splitUrl。

如果有人对如何解决这个问题有任何想法,我将不胜感激。

【问题讨论】:

    标签: ruby-on-rails url controller routing


    【解决方案1】:

    使用get '/gallery/:holiday/:country/:state=> 'Gallery#splitUrl'

    【讨论】:

    • 谢谢。我应该解释一下,我不能使用这样的简单路线,因为收藏的深度可能是无限的(它们将保持合理),但并不总是假日、国家和州。
    【解决方案2】:

    我认为您不需要使用redirect_to,只需在splitUrl 的末尾调用一个方法来操作/渲染集合即可。

    如果您进行重定向,它将生成另一个 URL 发送到浏览器,然后浏览器将要求您的服务器提供新 URL。如果您的服务器重定向到相同的 URL,这将产生无限循环。

    http://api.rubyonrails.org/classes/ActionController/Redirecting.html#method-i-redirect_tohttp://en.wikipedia.org/wiki/HTTP_302 上查看更多信息


    使用show方法编辑:

    一种方法是您在show 方法中管理集合,例如:

    def show
      @collection = getCollection
      ...
    end
    
    def getCollection
      # find collection by id, if url is like /collection_id
      return Collection.find(param[:id]) if param[:id]
    
      # find collection with last id, if request is like /id1/id2/id3
      path_parts = params[:path].split('/')
      Collection.find(path_parts.last)
    end
    

    【讨论】:

    • 我会使用render,但我的 Collection Show 需要设置页面需要的其他实例变量。我需要它运行到 Collection#Show 操作,但保留 URL。我开始认为我在这里没有走正确的路。我认为我的困惑来自这样一个事实,即 Collection 是一个自我参照模型,我需要它们具有 /collection1/collection2/collection3/collection4... 样式的 url。然后我需要把它全部放在 /gallery url 下。有什么想法吗?
    • 基本的想法是你不需要重定向。所以你可以尝试发送到Collection#show 看看param[:id] 是不是collection1/collection2/coll3... 的一种,然后你管理show 中的所有集合。完成这项工作后,您可以考虑重构 show 以获得更好的代码。
    • 发送到是什么意思?
    • 刚刚使用我在画廊控制器中的 splitUrl 操作尝试了一些想法,并尝试了一个应该显示集合显示视图的 url。我确保需要的实例变量可用于模板和呈现的模板:“集合/显示”但我收到错误,指出我在模板中使用的部分无法找到,因为它正在查看画廊并且它们不存在那里。此外,params 中的操作显示为 splitUrl,这是合乎逻辑的,但由于我的一些样式基于此,它失败了。我仍然认为我没有正确执行此操作?有人有什么想法吗?
    • 刚刚在我的 OP 的后半部分添加了更多细节
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多