我正在开发一个显示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?)
如果没有,那么如何解决这个问题?
答案 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的格式,这样就解决了我的问题。