Rails新模型字段抛出未定义的方法错误

时间:2011-12-06 22:20:37

标签: ruby-on-rails activerecord

我意识到有几个关于这个问题的SO问题,this one对它进行了非常详细的描述,但未被接受或跟进。

我使用迁移为模型添加了一个新字段'is_ignored';该字段已经在mysql数据库中。该字段在schema.rb中列出,并在模型定义中标记为attr_accessible,但在尝试分配值时仍会抛出未定义的方法错误。

以下是我正在使用的内容。

迁移(按预期工作和填充字段):

  def self.up
    add_column :user, :is_ignored, :boolean

    User.reset_column_information
    User.find(:all).each do |p|
      p.update_attribute :is_ignored, false
    end

架构(注意RM中的“转到声明”会把我带到这里,就像工作区一样):

  create_table "users", :force => true do |t|
    ...
    t.datetime "updated_at"
    t.boolean  "is_ignored"
  end

控制器:

  params[:selected_users].each do |id|
    @user = User.find(id)
    @user.is_ignored = false #here is where the error is being thrown
    @user.save
  end

到目前为止,我在控制器上投入了大量时间,如果我不是必须的话,我宁愿不把它吹走并重新支撑。在我可能忽略的模型中手动添加新字段是否还有其他步骤?

修改

我还验证了我可以访问此字段并从rails控制台设置一个值,并且在执行调用时@user在我的控制器中不是nil;但它仍然会抛出这个undefined_method错误。

第二次修改:

所以这很酷;一位朋友建议将此方法调用替换为:

@user.update_attribute( :is_ignored, false )

我们期望哪个有效,但没有!它抛出了与之前相同的未定义方法错误...

3 个答案:

答案 0 :(得分:1)

我的一位朋友帮助我解决了这个问题,最终归结为我从表格中获取ID的方式:

<td><%= check_box_tag "selected_users[#{ignored_user.id}]" %></td>

我不知道的是,在方括号中放置一些内容不会像我预期的那样创建该对象的数组,而是创建一个由放置在方括号中的对象键入的复选框值的哈希值。因此,当控制器操作时,我正在传递散列:

{'42'=>'1'}

更改我的代码以将第二个参数传递到do块中,拆分此哈希并允许我对所选用户的id进行操作:

params[:selected_users].each do |id,value|
  @user = User.find(id)
  @user.is_ignored = false #here is where the error is being thrown
  @user.save
end

答案 1 :(得分:0)

您不必将字段添加到attr_accessible,因为它的列支持字段(活动记录将能够使用该字段而无需任何其他代码)。您是否尝试重新启动开发服务器(重新运行'rails server')?

答案 2 :(得分:0)

UserUserFacebookFriend? - 这对我来说似乎是不同的模特。您只是将列添加到User