2011-12-06 44 views
1

我意识到有几个关于这个问题的SO问题和this one描述它非常密切,但没有被接受或后续。Rails新模型字段抛出未定义的方法错误

我已经使用迁移为模型添加了一个新字段'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 

我有很多时间投入到控制器到目前为止,宁可不打击如果我不是绝对必须的话,它就会重新搭起脚手架。是否还有一些手动将新字段添加到我可能忽略的模型中?

编辑:

我也验证了我可以访问此领域中,距离轨道控制台的值,并在执行呼叫时@user是不是在我的控制器零;但它仍然会抛出这个undefined_method错误。

第二个编辑:

所以这是很酷;朋友建议更换这种方法如下所示:

@user.update_attribute(:is_ignored, false) 

我们期望能够工作,但没有!它抛出了与以前一样的未定义方法错误...

+0

什么是实际的错误消息/堆栈跟踪? –

+0

此外 - 你确定你已经迁移到正确的环境? –

+0

我其实回答了下面的问题;调试器显示id对象我被灌入do块是一个哈希数组,我把它当作一个ID数组来处理...... – BrMcMullin

回答

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 
0

您不应该将字段添加到attr_accessible,因为它的列支持字段(活动记录将能够在没有任何附加代码的情况下与字段一起使用)。您是否尝试重新启动开发服务器(重新运行'rails server')?

+0

事实上,我有几次,但没有改变应用程序的行为。我甚至用cports验证过,在重新启动之前没有任何进程正在监听3000,所有这些都没有任何影响。 – BrMcMullin

+1

hmmm,你能登录到你的数据库并看到该列存在于模式中吗?你能够填充rails控制台内的字段吗? – jwarzech

+0

我看到数据库中的列,并且能够查询它。试图从控制台上得到它,但我甚至无法摆脱首位用户模式的困扰。 – BrMcMullin

0

UserUserFacebookFriend? - 这些对我来说看起来像不同的模型。您只将列添加到User

+1

糟糕!在发布到SO之前忘记将其更改为用户。固定。 – BrMcMullin

相关问题