未定义的方法`id'代表“2”:字符串

时间:2014-12-16 17:00:01

标签: ruby-on-rails ruby

这可能是一个简单的问题。我试图通过表单选择更新用户实例的性别,但遇到了问题。以下是相关模型:

user.rb

class User < ActiveRecord::Base

  . . .

  has_one :user_sex
  has_one :sex, :through => :user_sex

  accepts_nested_attributes_for :user_sex
end

sex.rb

class Sex < ActiveRecord::Base
  enum options: [:"Not Known", :"Male", :"Female", :"Not Applicable"]
  has_one :user_sex
  has_one :user, :through => :user_sex
end

user_sex.rb

class UserSex < ActiveRecord::Base
  belongs_to :user
  belongs_to :sex
end

这是我模板的相关部分:

edit.html.erb

. . .

<div class="form-group">
  <%= f.label :sex %><br />
  <%= f.select :sex, Sex.options, :class => "form-control" %>
  <%= showErrorMessages("Sex", :sex) %>
</div>

. . .

这是我的选择代码的HTML输出:

<select id="user_sex" name="user[sex]">
  <option value="0">Not Known</option>
  <option value="1">Male</option>
  <option value="2">Female</option>
  <option value="3">Not Applicable</option>
</select>

当我提交表单时,我收到的错误是&#34;未定义的方法`id&#39; for&#34; 2&#34;:String&#34;然后查看更多与错误相关的消息(参见附图)。有谁知道如何解决这个问题?enter image description here

1 个答案:

答案 0 :(得分:1)

尝试更改您宣布枚举的方式(可能直接属于用户,除非您希望他们有多个性别,您随时间跟踪?)。请尝试以下方法:

class User < ActiveRecord::Base
  enum sex: { unknown: 0, male: 1, female: 2, n_a: 3 }
end

然后只需在数据库中设置默认值0并按预期分配。

如果你想为多个班级添加性别,我建议使用ActiveSupport::Concern,如下所示:

#app/models/concerns/sex.rb
module Sex
  extend ActiveSupport::Concern

  included do
    enum sex: { unknown: 0, male: 1, female: 2, n_a: 3 }
  end
end

# app/models/user.rb
class User < ActiveRecord::Base
  include Sex
end