Rails自定义路由不保留URL

时间:2014-01-17 16:49:26

标签: ruby-on-rails url controller routing

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

我希望最终得到一个网址:

  

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

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

目前,我还没有实现在网址中使用的slugs,所以目前网址需要:

  

/画廊/ 594 /597分之595

每个数字都是集合的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风格?

在构建我的应用程序结束时,图库网址应该是:

/画廊/假期/美洲/加利福尼亚/ DAY1 /

没有决定是否在自己的页面上实际拥有单张照片,但如果我这样做则需要在网址的末尾。

我有几个画廊模型:

收藏 专辑 照片 PhotoSize

收藏集可以包含其他收藏品或专辑但不包含两者。

我认为我不会以正确的方式解决这个问题,但却无法确定解决这个问题的正确方法。

我也不希望/ collections / URL工作,因为我希望人们不得不使用完整的URL来访问它们。

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

如果有人对如何解决这个问题有任何想法,那么我非常感激。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我认为您不需要使用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