JobsController中的NoMethodError #new

时间:2016-08-24 16:37:18

标签: ruby-on-rails ruby ruby-on-rails-4

尝试在我的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

1 个答案:

答案 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 :opportunityhas_many :opportunities关系。如果每个作业都有很多作业,请删除belongs_to

其次,您的@job = Job.opportunity.new do |j|行正在调用常量而不是实例上的方法。将此行更改为:

@job = Job.new
@job.opportunties.new do |j|

上面的代码假设您使用了重复关联的has_many变体。

希望有所帮助。