2011-04-26 78 views
0

我的Ruby版本:红宝石1.8.7(2011-02-18 patchlevel 334)[i386-mingw32] 我的Rails版本:Rails 2.3 0.11Rails:没有路由匹配时,我重写模型中的默认id并使用命名路由

我得到的错误是:

No route matches "/hcfcdsensors/4513.0/show_graph_hcfcd" with {:method=>:post} 

这里是我的模型

class Hcfcdsensor < ActiveRecord::Base 
    set_primary_key :device_id 
    has_one :hcfcdsensorvalue 
    has_many :hcfcdraindatas 
end 

class Hcfcdsensorvalue < ActiveRecord::Base 
    belongs_to :hcfcdsensor 
end 

class Hcfcdraindata < ActiveRecord::Base 
    set_table_name 'hcfcdraindata' 
    belongs_to :hcfcdsensor 
end 

我的航线有:

map.resources :hcfcdraindatas 
map.resources :hcfcdsensors 

map.show_graph_hcfcd 'hcfcdsensors/:device_id/show_graph_hcfcd', :controller => 'hcfcdsensors', :action => 'show_graph_hcfcd' 

的link_to_remote声明:

<%= link_to_remote "show" , :url => show_graph_hcfcd_url(@hcfcdsensors[0]) ,:update => "graphDiv" %> 

的 “DEVICE_ID” 字段的类型为double。这个路由系统工作正常,如果我删除主键覆盖并用“:id”替换路由中的“:device_id”

任何帮助,非常感谢。

感谢, Shaunak

回答

1

我相信你的路径.0部分是混乱的路由引擎。 :device_id组件中通常不允许使用周期,因为它被用作分隔符。

你可以做的是用你的号码中的违规.替换为其他字符,或者使用乘以比例因子的值来达到所需的精度。举例来说,如果你需要三个值得的精度小数位,用途:

show_graph_hcfcd_url((@hcfcdsensors[0] * 1000).to_i) 

当读取参数,转换背下来:

hfcd = params[:device_id].to_f/1000 

它可以很方便在相关的控制器定义常量以表示该缩放因子并避免具有这种硬编码的幻数。

+0

谢谢tadman。这工作完美!的确。混淆了路由引擎。 – Shaunak 2011-04-27 04:54:08

0

为什么device_id a double?它是一个传统数据库吗?即便如此,我不知道为什么有人会使用double作为主键。

您应该将其更改为integer

如果您不能这样做,则应将以下方法添加到Hcfcdsensor

def to_param 
    primary_key.to_i.to_s 
end 
+0

是的,它是一个Double,没有它不是遗留数据库,而是一个数据库,代表分配给现场传感器的遗留ID。但是,主要关键是双重的吗?特别是当这张桌子不增长时。 – Shaunak 2011-04-27 06:49:33

+0

我认为奥斯汀提到的事实是双打是非常挑剔的,一些价值观不可能精确地表达,总是以非常近似的方式结束。在可以的地方,使用固定位置的'NUMERIC'字段而不是开放式浮点数,以便正确定义精度。 – tadman 2011-04-27 15:07:18