所以我有一个ActiveRecord(rails模型)类:
class User < ActiveRecord::Base
attr_accessor :somevar
end
当我这样做时
@u=User.find(1)
@u.somevar = 1
我得到了
undefined method `somevar=' for #<Class:0x007fa8cd0016a8>
我在数据库中没有名为somevar
的列
在添加rails server
(以防万一)后,我已重新启动attr_accessor
仍然得到血腥的错误
用Google搜索很多!
错误在哪里?有什么想法吗?
我赞成所有答案!谢谢!
我使用Devise来管理我的用户。
此外,我尝试在某些模型上添加默认条件,以过滤结果。这是基于&#39; company_id&#39;在用户模型中。我尝试在default_scope
中使用会话变量并找到this。它基本上说将会话变量用于默认条件是不好的做法,我可以使用Devise并添加一些修改。
这导致我的User model
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
attr_accessor :current_company
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
belongs_to :company
end
我的ApplicationController
class ApplicationController < ActionController::Base
around_filter :scope_current_user
def scope_current_user
User.current_company = current_user.company_id
yield
ensure
#avoids issues when an exception is raised, to clear the current_id
User.current_company = nil
end
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
end
然后从ApplicationController
undefined method `current_company=' for #<Class:0x007fa8cd0016a8>
如果我手动定义方法,也会发生同样的情况:
def current_company
@current_company
end
def current_company=(new_val)
@current_company = new_val
end
答案 0 :(得分:1)
这是不正确的:
User.current_company = current_user.company_id
attr_accessor :current_company
行向User 实例添加属性,而不是User 类。您可以将current_company
访问者用作:
current_user.current_company = # whatever
this url中缺少的是它实际上使用的是cattr_accessible
而不是attr_accessor
。所以你的模型应该是:
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
cattr_accessible :current_company
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
belongs_to :company
end
这应该有用。
基于最后编辑的更新:
即使您手动定义方法,也会遇到同样的错误:您正在定义实例方法并尝试将它们称为类方法。您应该将它们定义为类方法,这可以通过在方法名称之前添加self.
来完成,如下所示:
def self.current_company
@@current_company
end
def self.current_company=(new_val)
@@current_company = new_val
end
如果这不起作用,请告诉我。