尝试在我的CRM项目中创建新作业时出现无方法错误。我在一个月前开始在公司工作时已经完成了这个项目,已经对代码库进行了几次审核,并没有看到问题或者事情没有增加。我觉得好像因为沮丧而忽视了它,所以我向一些经验丰富的Rails开发人员寻求帮助。提前谢谢!
出现错误的Jobs Controller的相关部分:
# GET /jobs/new
def new
@job = Job.opportunity.new do |j|
if params[:opportunity_id].present?
j.opportunity_id = params[:opportunity_id]
end
工作/新视图:
<% @job[:opportunity_id] = params[:opportunity_id] %>
<% title "New #{@job.opportunity.name} Job"%>
<%
@job[:name] = @job.opportunity.name
@pm = @job.opportunity.pm_id
%>
<br><br>
<%= render 'form' %>
工作模式:
class Job < ActiveRecord::Base
mount_uploader :file1, AttachmentUploader
belongs_to :cost_proposal
belongs_to :opportunity
def Job
has_many :opportunities
end
end
schema.rb中的作业表:
create_table 'jobs', force: true do |t|
t.integer 'cost_proposal_id'
t.string 'number'
t.string 'name'
t.date 'flight_date'
t.string 'flight_sub'
t.string 'camera'
t.string 'roll'
t.string 'map_type'
t.integer 'plan_only'
t.integer 'lab_only'
t.integer 'est_hrs_model'
t.date 'due_date'
t.integer 'edge_job_id'
t.integer 'custom_trans'
t.integer 'comp_inhouse'
t.date 'delivered_date'
t.integer 'done'
t.date 'control_in'
t.string 'control_status'
t.date 'at_date'
t.string 'control_results'
t.integer 'control_check'
t.string 'scan_staff'
t.date 'scan_date'
t.integer 'scan_check'
t.string 'comp_staff'
t.date 'comp_date'
t.integer 'comp_check'
t.string 'comp_sub'
t.date 'comp_sub_due_date'
t.integer 'comp_sub_rec'
t.string 'img_staff'
t.date 'img_date'
t.integer 'img_check'
t.string 'edit_staff'
t.date 'edit_date'
t.integer 'edit_check'
t.text 'notes'
t.string 'file1'
t.string 'file2'
t.string 'file3'
t.string 'file4'
t.string 'file5'
t.string 'add_files'
t.datetime 'created_at'
t.datetime 'updated_at'
t.integer 'flown'
t.integer 'cust_trans'
t.integer 'delivered'
t.string 'at_staff'
t.integer 'at_check'
t.integer 'opportunity_id'
end
答案 0 :(得分:1)
你的协会需要一些关注。在您的工作模型中,您既有机会也有机会。这不是这应该如何工作。您可以拥有机会集合中的primary_opportunity,但具有属性集。
首先,这是错误的:
def Job
has_many :opportunities
end
不应该有一个名为Job(大写字母J)的方法,以大写字母开头的单词是类和常量,而不是方法。
类方法(def Job)没有实例范围。这不是一个协会的地方。将方法放在def Job
中以创建在实例化之前可访问的方法。关联应驻留在实例方法定义中(在def Job
之外)删除def作业并结束。这将为您提供模型:
class Job < ActiveRecord::Base
mount_uploader :file1, AttachmentUploader
belongs_to :cost_proposal
belongs_to :opportunity
has_many :opportunities
end
从那里,您需要确定是否要有belongs_to :opportunity
或has_many :opportunities
关系。如果每个作业都有很多作业,请删除belongs_to
。
其次,您的@job = Job.opportunity.new do |j|
行正在调用常量而不是实例上的方法。将此行更改为:
@job = Job.new
@job.opportunties.new do |j|
上面的代码假设您使用了重复关联的has_many
变体。
希望有所帮助。