无法分配用户属性Rails

时间:2011-12-27 20:57:05

标签: ruby-on-rails attributes devise

我有一个用于我的用户模型的rails应用程序。在我的应用中,用户可以通过注册注册课程。我添加了hour_learned和hours_taught。注册后,我尝试将学习时间添加到当前用户,但由于某种原因,它将无法正常工作。我没有得到任何错误,但它只是不会插入到数据库中。我的用户模型中有一个注册方法,如下所示:

def enroll!(course, user)
    enrollments.create!(:course_id => course.id, :active => true)
    user.hours_taught = user.hours_taught + (course.hours_long)
end

是的,我确保属性可以访问。仍然没有去。任何帮助将非常感激。

2 个答案:

答案 0 :(得分:1)

为什么您在User模型上定义的此方法将user对象作为参数?你应该这样定义:

def enroll!(course)
  enrollments.create!(:course => course, :active => true)
  self.hours_taught = self.hours_taught + (course.hours_long)
  self.save!
end

此方法将被定义为此类的实例方法,因此您可以像这样调用它:

user.enroll!(course)

这意味着您不需要将此方法作为参数传递给用户。在方法内部,我们获取course对象并将其分配给注册,执行小时数学运算,然后使用save!保存它,如果reocrd无效,则会引发异常(ActiveRecord::RecordInvalid 1}}或ActiveRecord::RecordNotSaved

答案 1 :(得分:0)

你得到什么错误信息?

此外,通常模型的实例方法不包含obj本身的参数。在模型中使用self。例如

class User << ActiveRecord::Base
  ...

  def enroll!(course)
    enrollments.create!(:course_id => course.id, :active => true)
    self.hours_taught = self.hours_taught + (course.hours_long)
    save!
  end
  ...

已添加为何需要保存...

请记住,ActiveRecord确实在两个地方跟踪其模型的数据:“内存”和数据库系统。

由于保存/更新记录的数据库副本在时间上很昂贵,因此您可能希望对记录的内存中版本进行一些更新,然后将其保存到数据库中。

或者,根据具体情况,您可能希望针对模型的给定操作是原子的,并且包括将更新的模型保存到数据库中。

在此示例中,您已将方法命名为enroll!的!是一个约定,暗示你想要注册! “全部做”的方法,包括更新数据库。

因此,在方法本身中,您需要将数据保存到dbms。

在对象的方法中包含save的问题在于,您可能最终会对数据库进行更多保存,然后才真正需要。最好一次保存多个更改,而不是对数据库进行多次保存。但是你不想把自己扭曲成结以最小化节省。 - 在计划sw流程时,请记住这个问题。