我意识到有几个关于这个问题的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 )
我们期望哪个有效,但没有!它抛出了与之前相同的未定义方法错误...
答案 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)
User
或UserFacebookFriend
? - 这对我来说似乎是不同的模特。您只是将列添加到User