2011-04-26 2 views
0

내 루비 버전 : 루비 1.8.7 (2011-02-18 패치 레벨 334) [i386-mingw32] 내 레일 버전 : Rails 2.3 0.11는레일 : 모델의 기본 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"필드 더블 타입이다. 기본 키를 제거하고 ": device_id"를 ": 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

0

device_iddouble입니까? 그것은 레거시 데이터베이스입니까? 그럼에도 불구하고 왜 어떤 사람이 기본 키에 double을 사용하는지 알지 못합니다.

integer으로 변경해야합니다.

할 수 없다면 다음 방법을 Hcfcdsensor에 추가해야합니다.

def to_param 
    primary_key.to_i.to_s 
end 
+0

예, 해당 Double 및 기존 데이터베이스가 아니라 필드에 센서에 할당 된 레거시 ID를 나타내는 데이터베이스. 하지만 기본 키가 배가 된 이유는 무엇입니까? 특히이 테이블이 성장하지 않을 때. – Shaunak

+0

오스틴은 복식이 아주 까다 롭고 일부 값은 정확하게 표현할 수 없다는 사실을 언급하면서 항상 근사값에 근접한다고 생각합니다. 할 수있는 곳은 고정 소수점으로 된 'NUMERIC' 필드를 사용하여 정밀도가 적절하게 정의됩니다. – tadman

관련 문제