我有两个关联的模型: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找不到工作”
答案 0 :(得分:1)
到达候选人#new时,您只是在丢掉工作ID。您并没有将其作为要提交给表单的数据的一部分,以便在创建控制器中提取。
鉴于您已经完全放弃了RESTful路由,最快的解决方案是将其添加到表单中:
<%= form.hidden_field :job_id, value: params[:id] %>
但是,我强烈建议您查看RESTful路由和嵌套资源。混乱的地方是传递给Candidate#new的ID是其他模型的ID。在求职时,您可能需要重新考虑让某个候选人属于某个职位,而当一个候选人对多个职位感兴趣时会发生什么呢?他们每次都创建一个新的个人资料吗?在工作现场,通常会有一个Job,一个候选人(或User / Profile)和一个JobApplication,后者将两者结合在一起。