Rails模型 - attr_accessor引发未知方法异常?

时间:2014-06-03 00:21:29

标签: ruby-on-rails rails-activerecord rails-models

短版本(虚拟代码):

所以我有一个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

1 个答案:

答案 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

如果这不起作用,请告诉我。