【问题标题】:ruby on rails id not savingruby on rails id 不保存
【发布时间】:2009-08-11 20:10:11
【问题描述】:

我知道这违反了 ruby​​ on rails 约定,但我的这个表的 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_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 文件之外还有其他地方我应该更改/检查吗?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    :id 字段不可用于批量分配。您需要手动设置它

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

    在您的控制器代码中。

    (如果您将:id 添加到您的attr_accessible 列表中,它也可能起作用,并且通常您应该为每个直接从表单参数批量分配的模型设置attr_accessible,但是没有测试我不确定它是否会起作用,你可能仍然需要手动设置:id)

    【讨论】:

    • 我有 @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]) if @probe.save flash[:notice] = "成功创建探针。" redirect_to probes_path else render :action => 'new' end end
    • 好吧,我智障了,哈哈。我忘了在 create 方法中传入@probe。但是现在我收到关于 srigify 键的错误...未定义的方法 `stringify_keys!'
    • 发生这种情况是因为我使用的 create 只接受哈希。 @Probe.save 工作正常。问题已解决。
    • 不,attr_accessible 不起作用。只能直接赋值,去他妈的。
    【解决方案2】:

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

    #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
    

    【讨论】:

    • 这是整数,rails 不喜欢非数字的主键。至少这是我正在阅读的内容。有没有办法将字符串设置为主键?
    • 我没有注意到您使用的是字符串...有充分的理由吗?
    • ID 是生成的 UUID,我这样做是因为 belongs_to 没有我需要的主键,所以我将其设为 ID,这样我就可以正确地将我的表连接在一起.
    【解决方案3】:

    我很确定 ActiveRecord 实例已设置,因此 id 属性不能通过批量分配设置,这通常是您通过这样的表单创建对象的方式。如果您查看您的日志,您可能会看到一条类似这些内容的警告。

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 2013-11-05
      相关资源
      最近更新 更多