无法获取非质量分配值来设置或保存

时间:2012-02-25 10:02:24

标签: ruby-on-rails ruby activerecord

这里令人沮丧的简单问题。我正在使用Rails 3.1并具有以下类:

class Job < ActiveRecord::Base
  attr_accessor :active
  attr_accessible :roleTagline, :projectTagline, :projectStartDate, :projectDuration, :postedStartDate,
    :postedEndDate, :skillsRequired, :skillsPro, :experiencedRequired, :description, :active
  scope :is_active, :conditions => {:active => 1}

  validates :roleTagline,  :presence => true,
                :length => { :minimum => 5 }
  validates :projectTagline, :presence => true,
                :length => { :minimum => 5 }
  belongs_to :job_provider

#   def active=(act)
#       @active = act
#   end
end

在我的控制器中,我正在尝试使用批量分配(ActiveRecord构建帮助程序之一)创建作业,然后将“active”属性设置为1,然后保存作业。这是控制器代码:

def create
  @job_provider = current_user.job_provider
  @job = @job_provider.jobs.build(params[:job])
  @job.active= 1 # debug logging @job.active here gives an empty string
  if @job.save # etc.

我已经尝试了删除attr_accessor并编写自己的setter的所有组合,但无论我做什么,我似乎无法找到正确的组合以使属性保留在模型上。它不是活跃的记录我不认为,因为即使在@ job.save之前,属性也已消失(使用调试日志记录)。我已经四处搜索,但无法弄清楚我做错了什么。有人可以帮忙吗?

编辑:来自rake的schema.rb:

create_table "jobs", :force => true do |t|
t.string   "roleTagline"
t.string   "projectTagline"
t.date     "projectStartDate"
t.integer  "projectDuration"
t.date     "postedStartDate"
t.date     "postedEndDate"
t.string   "skillsRequired"
t.string   "skillsPro"
t.string   "experiencedRequired"
t.string   "description"
t.datetime "created_at"
t.datetime "updated_at"
t.integer  "active"
t.integer  "job_provider_id"
end

另一个编辑:

好了,谷歌搜索后我终于找到了答案:

How can I override the attribute assignment in an active record object?

如果您要修改ActiveRecord属性而不是类实例,则需要执行以下操作:

self [:fieldname] = value

2 个答案:

答案 0 :(得分:3)

从模型中删除attr_accessor :active。它导致值保存在实例变量中,而不是通过attributes哈希值保存到数据库中。您不必编写访问者,因为ActiveRecord会根据active列自动为您执行此操作。

它在调试日志中显示为空白,因为它初始化为nil。如果删除attr_accessor行并将数据库中的active列更改为NOT NULL DEFAULT 0,则会在ActiveRecord迁移或schema.rb中将其初始化为0. ie :null => false, :default => 0

答案 1 :(得分:0)

我认为您没有将job_provider_id添加到att_accessible。请尝试以下

attr_accessible :roleTagline, :projectTagline, :projectStartDate, :projectDuration, :postedStartDate, :postedEndDate, :skillsRequired, :skillsPro, :experiencedRequired, :description, :active, :job_provider_id