Ruby on rails ruby on rails id未保存
我知道这违反了RubyonRails的约定,但我的表id不需要自动递增,我正在通过逻辑进行设置。但是,它不会保存到数据库中。保存的所有内容都保存为id的nullRuby on rails ruby on rails id未保存,ruby-on-rails,Ruby On Rails,我知道这违反了RubyonRails的约定,但我的表id不需要自动递增,我正在通过逻辑进行设置。但是,它不会保存到数据库中。保存的所有内容都保存为id的null 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_fo
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 %>
def self.up
创建表:探测,:id=>false do | t|
t、 字符串:id
t、 字符串:名称
t、 整数:用户id
t、 布尔值:在线
t、 时间戳
结束
结束
@令牌%>
这可能吗?或者除了new.html.erb文件之外,还有什么地方需要我更改/检查吗?我很确定
ActiveRecord
实例已经设置好,因此id
属性无法通过批量分配进行设置,而批量分配通常是通过这样的表单创建对象的方式。如果你查看日志,你可能会看到一条警告,上面写着这样的话
如果您专门设置id,而不是使用类似于p=Probe.new(params[:Probe])
的东西,那么您应该没问题。例如
p = Probe.new(params[:probe])
p.id = param[:probe][:id]
无法访问:id字段进行质量分配。您需要使用手动设置
@probe.id=params[:probe][:id]
在控制器代码中
(如果您将:id
添加到attr\u accessible
列表中,它也可能会起作用,一般来说,您应该为每个直接从表单参数分配质量的模型设置attr\u accessible
,但是如果不进行测试,我不确定它是否会起作用,您可能仍然需要手动设置:id
)从上的AdminMyServer
我的控制器中有@Probe=Probe.new(params[:Probe])@Probe=params[:Probe][:id],但仍然不工作。这是我的整个创建方法:def create@user=current_user@probe=probe.new(params[:probe])@probe.id=params[:probe][:id]@probe=@user.probes.create!(params[:probe])如果@probe.save flash[:notice]=“成功创建了探测。”重定向到探测路径,否则呈现:action=>“new”end endWell,我有点迟钝,哈哈。我忘了在create方法中传入@probe。但是现在我得到一个关于strigify键的错误…未定义的方法'stringify\u keys!'这是因为我使用了create,它只接受散列@“拯救”很好。问题已修复。不,属性不可用。只有直接赋值,f*ck。这是整数,rails不喜欢非数字主键。至少这是我读到的。有没有办法将字符串设置为主键?我没有注意到您正在使用字符串。。。有什么好的理由吗?这个ID是一个UUID生成的,我之所以这样做是因为我不能拥有我需要的主键,所以我把它作为ID,这样我就可以将我的表正确地连接在一起。
#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