我有一个模型,它用唯一的_id
属性覆盖url
属性:
class Website
include Mongoid::Document
include Mongoid::Timestamps
field :_id, type: String, default: ->{ url }
field :url, type: String
validates_uniqueness_of :url
end
我的控制器非常标准:
class WebsitesController < ApplicationController
def show
@website = Website.find(params[:id])
end
end
我的视图文件中的链接生成是:
Website.all.each do |website|
%p= link_to website.url, website_path(:id => website._id)
到目前一切尚好。但假设我有一个_id
"example.com"
的网站。当我单击指向website_path(:id => "example.com")
的链接时,:id
将在.
(点)之前被切割。所以,我很自然地得到了这个错误:
Started GET "/websites/example.com" for 127.0.0.1 at 2013-12-26 10:36:10 +0100
Processing by WebsitesController#show as
Parameters: {"id"=>"example"}
MOPED: 127.0.0.1:27017 QUERY database=myapp_development collection=websites selector={"_id"=>"example"} flags=[] limit=0 skip=0 batch_size=nil fields=nil runtime: 0.5150ms
Mongoid::Errors::DocumentNotFound -
...
...
我该怎么解决这个问题?
发布于 2013-12-26 17:37:42
你有路由问题。来自路由指南
默认情况下,动态段不接受点-这是因为点被用作格式化路由的分隔符。如果需要在动态段中使用点,则添加一个覆盖此内容的约束--例如,
id: /[^\/]+/
允许除斜杠以外的任何内容。
所以你需要调整你的路线来做这样的事情:
get '/websites/:id' => 'websites#show', :id => /[^\/]+/
# --------------------------------------^^^^^^^^^^^^^^^
这样Rails路由系统就不会认为.com
是一个格式扩展,比如.html
,.js
,.
https://stackoverflow.com/questions/20782772
复制相似问题