Rails 4,保存嵌套的属性

时间:2014-10-12 07:53:29

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

我有一个模特约会。工作需要很多技能。但是,当我试图保存我的工作时,它失败了。我不确定我明白自己做错了什么。 我的模特:

class Skill < ActiveRecord::Base

  has_many    :job_skills
  has_many    :jobs, through: :job_skills

end

class JobSkill < ActiveRecord::Base
  belongs_to :skill
  belongs_to :job

end

class Job < ActiveRecord::Base
  has_many    :job_skills, :inverse_of => :job
  has_many    :skills, through: :job_skills
  accepts_nested_attributes_for :job_skills
end

我的观点:

<%= form_for @job do |f| %>
    <div class="row">
        <div class="col-md-8">
            <h4>General informations</h4>
            <br />
            <div class="form-group">
                <%= f.label :title %>
                <%= f.text_field :title, :autofocus => true, class:'form-control' %>
            </div><br />

            <%= f.fields_for :job_skills do |s| %>
                <%= s.text_field :id %>
            <% end %>
        </div>
    </div>
    <div class="submit" style="position:relative;">
        <%= f.submit "Save", class: 'button button-small' %>
    </div>
<% end %>

我的控制器:

class JobsController < ApplicationController
  before_filter :authenticate_user!, :has_company?, :except => [:index, :show]

  def create
    @job = Job.new(job_params)
    @job.company_id = current_user.company_id
    @job.user_id = current_user.id
    if @job.save
      flash[:notice] = "This job offer has been saved."
      return redirect_to job_path(@job)
    else
      flash[:error] = @job.errors.full_messages.to_sentence
      render action: :new
    end
  end

  def new
    if current_user.company.present?
      @job = Job.new(email:current_user.email)
      @job.job_skill.build 
    else
      flash[:error] = "You need to create a company before posting a job"
      return redirect_to new_company_path()
    end
  end

  private

  def job_params
    params.require(:job).permit(:status, :title, :description, :remote ,:job_type, :visa_sponsor, :email, :salary_max, :salary_min, :country, :state, :city, job_skill_attributes: [:id])
  end

end

所以,我不确定我做错了什么,当我试图保存时,我收到以下错误:

  

@job = Job.new(job_params)

     

ActiveRecord :: RecordNotFound例外:

     

对于ID = nil

的作业,找不到ID = 4的技能

1 个答案:

答案 0 :(得分:0)

你的代码对我来说有点混乱。 看起来,你想要创造一份工作并定义,这项工作需要什么技能。 为什么需要嵌套属性? 通常,你

  • 编辑所有技能的列表,这些技能可能是作业可能需要的,然后将作业技能分配给该作业,而不是has_and_belongs_to_many关系,并且可以使用表单助手进行收藏。在这种情况下,您不需要模型JobSkill(但是表jobs_skills来存储关系并且由Rails透明地处理)

  • 或将随机技能添加到工作中,然后您的工作has_may :skills和每项技能只属于一项工作。在这里,您可以使用嵌套属性。然后,您需要一种方法来添加嵌套技能实例,即使用cocoon。同样,您不需要模型JobSkill

哪一个是你的用例,所以我可以更详细地解释一下。