[英]How to make underscore method available in view and controller in rails 3.2?
[英]Rails: How to make available parent attribute in setter method
语境:
我有一个有很多projects
的company
模型,有很多tasks
。 该company
还拥有许多employees
,而这些employees
又有很多tasks
。
架构:
问题:
我正在构建一个表单来创建一个用户可以添加多个tasks
。 提交后,表单应创建单个project
记录,一个或多个具有hours
和employee_id
属性的task
记录,并且(!)检查数据库中是否已存在employee
姓名或创建新employee
名称。
我通过在表单中添加jquery autocomplete
并在我的Task模型中使用getter
和setter
方法定义虚拟属性来解决这个问题。 与Railscast#102类似。
这成功地将employee_id
设置为tasks
并使用员工name
和task_id
创建新的employee
记录。
目前的问题是该模型没有保存company_id
。
我的代码:
class Task < ActiveRecord::Base
belongs_to :project
belongs_to :employee
def employee_name
employee.try(:name)
end
def employee_name=(name)
self.employee = Employee.find_or_create_by(name: name) if name.present?
end
end
题:
如何使父模型的company_id
属性可用于我的Task
模型的setter方法? 像这样:
def shareholder_name=(name)
self.shareholder = Shareholder.find_or_create_by(name: name, company_id: company_id) if name.present?
end
目前,这会产生错误:
undefined local variable or method "company_id" for #<Task:0x98438b8>
编辑:
或者,如果我尝试project.company_id
这告诉我project
是一个NilClass:
undefined method company_id for nil:NilClass
更新:
仍未解决。 任何想法,为什么project
是nil
吗?
class Task < ActiveRecord::Base
belongs_to :project
belongs_to :employee
def shareholder_name=(name)
self.shareholder = Shareholder.find_or_create_by(name: name, company_id: project.company_id) if name.present?
end
end
另外,所有带rails的典型模式,例如你有belongs_to :project
,它会将一个名为project
的实例方法添加到Task
,然后该实例方法可用于获取与任务相关联的项目,以及随后可能使用的关联company_id
感兴趣
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.