Rails: нет совпадения маршрутов, когда я переопределяю идентификатор по умолчанию в модели и использую именованный маршрут - PullRequest
0 голосов
/ 27 апреля 2011

Моя версия Ruby: ruby ​​1.8.7 (уровень обновления патча 334 - 2011-02-18) [i386-mingw32] Моя версия Rails: Rails 2.3.11

Я получаю ошибку:

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. Эта система маршрутов работает нормально, если я удаляю переопределение первичного ключа и заменяю «: device_id» в маршруте на «: id»

Любая помощь очень ценится.

Спасибо, Shaunak

Ответы [ 2 ]

1 голос
/ 27 апреля 2011

Я полагаю, что .0 часть вашего пути сбивает с толку механизм маршрутизации.Обычно точки не допускаются в компоненте :device_id, потому что он используется в качестве разделителя.

Что вы можете сделать, это заменить в вашем номере неправильное значение . чем-то другим путем подстановки строк или использовать значения, которыеумножаются на коэффициент масштабирования для достижения требуемой точности.Например, если вам нужна точность в три знака после запятой, используйте:

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

При чтении параметра преобразуйте обратно вниз:

hfcd = params[:device_id].to_f / 1000

Может быть удобно определить константув соответствующем контроллере для представления этого коэффициента масштабирования и избегания использования жестко закодированных магических чисел такого рода.

0 голосов
/ 27 апреля 2011

Почему device_id a double?Это устаревшая база данных?Несмотря на это, я не знаю, почему кто-то использовал бы double для первичного ключа.

Вы должны изменить его на integer.

Если вы не можете этого сделать, вы должны добавить следующий метод к Hcfcdsensor.

def to_param
  primary_key.to_i.to_s
end
...