2009-08-11 118 views
4

我知道这是违反轨道约定的红宝石,但我这个表的id不需要自动增量,我通过逻辑来设置它。但是,它不会保存到数据库中。所有保存的内容都保存为空。ruby​​ on rails id not saving

def self.up 
create_table :probes, :id => false do |t| 
    t.string :id 
    t.string :name 
    t.integer :user_id 
    t.boolean :online 
    t.timestamps 
end 
end 

<% form_for @probe do |f| %> 
<%= f.error_messages %> 
<p> 
    <%= f.label "Site name" %><br /> 
    <%= f.text_field :name %> 
</p> 
    <p style="margin-left: 10%"> 
    <%= f.label "Probe Key" %><br /> 
    <%= f.text_field :id, :value => @token %> 
</p> 
<p style="margin-left: 20%"> 
    <%= link_to "Back to List", probes_path %> 
    <%= f.submit "Submit",:style => "margin-left: 75px;" %></p> 
<% end %> 

这甚至有可能吗?或者,除了new.html.erb文件之外,我应该更改/检查什么地方?

回答

5

:id字段不可用于批量分配。你需要与

@probe.id = params[:probe][:id]

在控制器代码

手动设置。

(这也可能工作如果添加:idattr_accessible列表,一般你应该设置attr_accessible每一个模型是直接大规模分配从表单参数,但W/O测试我不知道是否会工作,你仍然可能需要手动设置:id

+0

我 @Probe = Probe.new(PARAMS [:探测]) @Probe =参数s [:probe] [:id] 在我的控制器中,但仍然无法正常工作。这是我的整个创建方法: DEF创建 \t @user = CURRENT_USER \t @probe = Probe.new(PARAMS [:探针]) \t @ probe.id =参数[:探头] [:ID] @ probe = @ user.probes.create!(params [:probe]) if @ probe.save flash [:notice] =“成功创建探针。” redirect_to probes_path else render:action =>'new' end end – Ryan 2009-08-11 20:25:43

+0

好吧,我被推迟了,哈哈。我忘了在create方法中传入@probe。然而,现在我得到一个关于strigify键的错误...未定义的方法'stringify_keys!' – Ryan 2009-08-11 20:57:35

+0

而这种情况发生是因为我使用的是只接受哈希的创建。 @ Probe.save工作正常。问题已修复。 – Ryan 2009-08-12 13:08:58

0

我很确定ActiveRecord实例已设置,因此id属性不能通过批量赋值来设置,这通常是您如何通过类似的表单创建对象的方式。如果你看看你的日志,你可能会看到一条警告,沿着这些线条说。

如果你专门设置了ID而不是使用类似p = Probe.new(params[:probe])的东西,那么你应该没问题。例如。

p = Probe.new(params[:probe]) 
p.id = param[:probe][:id] 
1

从AdminMyServer上https://stackoverflow.com/questions/517869/id-field-without-autoincrement-option-in- migration

#using a number 
create_table(:table_name, :id => false) do |t| 
    t.integer :id, :options => 'PRIMARY KEY' 
end 

#using as string, like the question (why?) 
create_table(:table_name, :id => false) do |t| 
    t.string :id, :options => 'PRIMARY KEY' 
end 
+0

这是整数,rails不喜欢非数字主键。至少这就是我正在阅读的内容。有没有办法将字符串设置为主键? – Ryan 2009-08-11 20:44:35

+0

我没有注意到你正在使用字符串...有一个很好的理由,为什么? – 2009-08-11 20:59:28

+0

这个ID是一个UUID生成的,我这样做是因为belongs_to不能有我需要的主键,所以我将它作为ID,这样我就可以正确地将我的表连接在一起。 – Ryan 2009-08-12 13:10:21