2009-08-11 122 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