首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自定义Mongoid 4.0.0 _id,包含。(点)不能通过params查询(Rails 4)

自定义Mongoid 4.0.0 _id,包含。(点)不能通过params查询(Rails 4)
EN

Stack Overflow用户
提问于 2013-12-26 09:58:39
回答 1查看 122关注 0票数 1

我有一个模型,它用唯一的_id属性覆盖url属性:

代码语言:javascript
运行
复制
class Website
  include Mongoid::Document
  include Mongoid::Timestamps
  field :_id, type: String, default: ->{ url }
  field :url, type: String
  validates_uniqueness_of :url
end

我的控制器非常标准:

代码语言:javascript
运行
复制
class WebsitesController < ApplicationController
  def show
    @website = Website.find(params[:id])
  end
end

我的视图文件中的链接生成是:

代码语言:javascript
运行
复制
Website.all.each do |website|
  %p= link_to website.url, website_path(:id => website._id)

到目前一切尚好。但假设我有一个_id "example.com"的网站。当我单击指向website_path(:id => "example.com")的链接时,:id将在.(点)之前被切割。所以,我很自然地得到了这个错误:

代码语言:javascript
运行
复制
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 - 
...
...

我该怎么解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-26 17:37:42

你有路由问题。来自路由指南

默认情况下,动态段不接受点-这是因为点被用作格式化路由的分隔符。如果需要在动态段中使用点,则添加一个覆盖此内容的约束--例如,id: /[^\/]+/允许除斜杠以外的任何内容。

所以你需要调整你的路线来做这样的事情:

代码语言:javascript
运行
复制
get '/websites/:id' => 'websites#show', :id => /[^\/]+/
# --------------------------------------^^^^^^^^^^^^^^^

这样Rails路由系统就不会认为.com是一个格式扩展,比如.html.js,.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20782772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档