routes.rb在Rails 4中没有与composite_primary_keys匹配的路由

时间:2015-10-28 16:58:16

标签: ruby-on-rails rails-activerecord

我有一个带有复合主键的旧数据库。我已成功将composite_primary_keys gem添加到项目中,并可以检索并为相关对象创建新记录。更新,删除或显示单个记录的操作无效,并且失败并显示错误 '没有路线匹配[GET]“/ estimates / 4.0,Test,A.0.0'

该类定义为:

class Estimate < ActiveRecord::Base
  self.table_name = 'estimate'
  self.primary_keys = [:es_gsu_id, :es_loc_name, es_blh_flag, :es_version_id]
end

并且使用以下命令修改了routes.rb:

Rails.application.routes.draw do
  constraints(:id => /\w+(,\w+)*/) do
    resources :estimates
  end

  resources :estimates
end

我认为Rails 4会正确配置它。我可以检索所有并创建新的,如上所述,但实际依赖于指定PK字段的单一访问在路由上失败。

任何人都可以看到我做错了什么或我错过了什么?

1 个答案:

答案 0 :(得分:0)

我遇到了完全相同的问题,经过大量测试后发现了以下解决方案:

首先,由于您偏离了默认&#39; id&#39;由Rails分配的主键,您需要将其添加到routes.rb:

var merge = require('merge-stream');

gulp.task('scripts', () => {
  var js = gulp.src('app/scripts.babel/**/*.js')
    .pipe($.sourcemaps.init())
    .pipe($.babel({ presets: ['es2015'] }))
    .pipe($.rename({dirname:''}))

  return merge(
    js.pipe($.clone())
      .pipe($.sourcemaps.write('.'))
      .pipe(gulp.dest('app/scripts')),
    js.pipe($.clone())
      .pipe($.uglify())
      .pipe(gulp.dest('dist/scripts')));
});

只需在&#39; param&#39;中提及复合键的一个属性即可。哈希会做。

其次,您不需要这段代码

resources :estimates, param: :es_gsu_id

现在,您对/estimates/4.0,Test,A.0.0的GET请求将被路由到&#39; show&#39;估计&#39;的行动控制器,您可以使用&#39; find&#39;像这样的方法:

Rails.application.routes.draw do
 constraints(:id => /\w+(,\w+)*/) do
   resources :estimates
end

params [:es_gsu_id]将具有值&#39; 4.0,Test,A,0.0&#39;这将由&#39;发现&#39;搜索与此组合键匹配的唯一记录的方法。