Rails:url_encode同时也编码`.`(或:html_safe用于url_encoding)

时间:2015-10-23 12:48:11

标签: ruby-on-rails ruby filepath url-encoding

我正在开发一个显示Git存储库内容的Rails应用程序。

因为我想让路线看起来很漂亮(和搜索引擎友好),我想使用以下格式: website.com/repository_name/branch/preview_file/:file_path

所以我为我的RepositoriesController设置了一个类似于

的路由
member do
  get 'preview_file/:file_path', action: :preview_file, as: :preview_file
end

这适用于(大多数)目录,但是当传递包含句点的任何file_path(例如:fancy_image.png)时,它会出错,因为Rails会尝试以文件指定的格式提供内容路径。

因此,我希望urlencode文件名中存在的所有句点(.%2E

然而,这会产生以下问题:在视图中使用例如路径构建路径时preview_file_repository_path(@repository,file_path: file_path),结果再次通过路径扩展帮助程序进行转义(将%更改为%25)。

因此,我希望branch/preview_file/fancy_image.png转变为branch/preview_file/fancy_image%2Epng,然后转为branch/preview_file/fancy_image%252Epng

现在,我可能会覆盖默认的ERB url_encode方法,但这似乎是一个非常麻烦的想法,可能会破坏其他东西。

有没有办法告诉Rails某个值不需要再次进行url_encoded? (类似于html_safe,但后来用于urlencoding?)

如果没有,那么如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

事实证明,可以将format: false标志传递给config/routes.rb文件中的路由。所以我之前的例子是:

member do
  get 'preview_file/:file_path', action: :preview_file, as: :preview_file
end

变成

member do
  get 'preview_file/:file_path', action: :preview_file, as: :preview_file, format: false
end

这可以确保Rails不再尝试解析一段时间内拆分URL的格式,这样就解决了我的问题。