关于Rails关联并传递另一个模型:id作为参数的问题

时间:2019-05-02 17:04:13

标签: ruby-on-rails associations

我有两个关联的模型:Job和Candidate。当用户通过候选“新”视图申请工作清单时,候选模型将更新。由于我已将求职者与Job模型相关联,因此无法保存任何新的求职者实例。我知道我必须传递job_id作为参数,以便任何新的Candidate实例都引用特定的Job,但是我只是无法弄清楚自己在做什么错。同样,Job模型与Devise User模型相关联,而Candidate与User模型无关。这可能是问题吗?预先感谢。

我已经在我的候选人控制器中尝试了很多事情,但是现在我又回到了将候选人模型与Job模型相关联之前的样子,因此我可以重新开始,就像我刚运行了迁移到AddJobToCandidate

candidates_controller.rb

select first_name || ' ' || last_name || ' ' || job_id AS NewName from employees;

views / candidates / new.html.erb

class CandidatesController < ApplicationController
  def index
    @candidates = Candidate.all
  end

  def new
    @candidate = Candidate.new
    render layout: false
  end

  def single
    @candidate = Candidate.find(params[:id])
  end

  def create
    @candidate = Candidate.new(candidate_params)
    if @candidate.save
      redirect_to root_path
    else
      render "new"
    end
  end

  private 
  def candidate_params 
    params.require(:candidate)
          .permit(:first_name, :last_name, :email, :cover_letter, :ph, :job_id)
  end

end

routes.rb

<h1>Work at <%= current_user.company %></h1>

<%= simple_form_for @candidate do |form| %>
  <%= form.input :first_name, label: "First Name" %>
  <%= form.input :last_name, label: "Last Name" %>
  <%= form.input :email, label: "Email" %>
  <%= form.input :cover_letter, label: "Cover Letter" %>
  <%= form.input :ph, label: "Phone Number" %>


  <%= form.button :submit %>
<% end %>

views / jobs / listing.html.erb 唯一链接到候选人/new.html/erb的视图

Rails.application.routes.draw do
  get 'candidates/index'
  get 'candidates/new/:id' => 'candidates#new', :as => 'apply'
  get 'candidates/single/:id' => 'candidates#single', :as => 'viewcandidate'
  get 'jobs/index'
  get 'jobs/new'
  get 'jobs/listing/:id' => 'jobs#listing', as: 'listing'
  get 'jobs/listings', :as => 'careerpage'
  get 'jobs/dashboard'
  get 'jobs/single/:id' => 'jobs#single', :as => 'viewjob'
  devise_for :users, controllers: { sessions: "users/sessions" }
  resources :candidates
  resources :jobs
  root 'jobs#dashboard'
end

候选人/职位关联迁移

<h1><%= @job.title %></h1>
<p><%= @job.description %></p>
<p><%= link_to "Apply", apply_path(@job.id) %></p>

jobs_controller.rb(不要认为这是必要的,但我还是会包括在内)

class AddJobToCandidate < ActiveRecord::Migration[5.2]
  def change
    add_reference :candidates, :job, foreign_key: true
  end
end

未显示任何错误,但未更新模型。

我在候选控制器#create操作中尝试过的一件事是:

class JobsController < ApplicationController
   before_action :authenticate_user!

  def index
    @jobs = current_user.jobs.all
  end

  def dashboard

  end

  def new
    @job = Job.new
  end

  def listing
    @job = Job.find(params[:id])
    render layout: false
  end

  def listings
    @jobs = current_user.jobs.all
    render layout: false
  end

  def single
    @job = Job.find(params[:id])
    @candidates = Candidate.all
  end

  def create
    @job = current_user.jobs.new(job_params)
    if @job.save
      redirect_to jobs_index_path
    else
      render "new"
    end
  end

  private 
  def job_params 
    params.require(:job)
          .permit(:title, :description, :url, :user_id)
  end

end

我得到的错误是'nil:NilClass的'undefined method'candidates''

我尝试的另一件事是在#create动作中添加以下行:

def create
    @candidate = @job.candidates.create(candidate_params)
    if @candidate.save
      redirect_to root_path
    else
      render "new"
    end
  end

我得到的错误是“没有ID找不到工作”

1 个答案:

答案 0 :(得分:1)

到达候选人#new时,您只是在丢掉工作ID。您并没有将其作为要提交给表单的数据的一部分,以便在创建控制器中提取。

鉴于您已经完全放弃了RESTful路由,最快的解决方案是将其添加到表单中:

 <%= form.hidden_field :job_id, value: params[:id] %>

但是,我强烈建议您查看RESTful路由和嵌套资源。混乱的地方是传递给Candidate#new的ID是其他模型的ID。在求职时,您可能需要重新考虑让某个候选人属于某个职位,而当一个候选人对多个职位感兴趣时会发生什么呢?他们每次都创建一个新的个人资料吗?在工作现场,通常会有一个Job,一个候选人(或User / Profile)和一个JobApplication,后者将两者结合在一起。