Связи Rails и передача другой модели: id в качестве аргумента - PullRequest
0 голосов
/ 02 мая 2019

У меня есть две связанные модели: работа и кандидат.Модель кандидата обновляется, когда пользователь подает заявку на список вакансий с помощью нового представления кандидатов.Поскольку я связал кандидата с моделью задания, я не могу сохранить новые экземпляры кандидата.Я знаю, что должен передать job_id в качестве параметра, чтобы любой новый экземпляр Candidate ссылался на конкретное задание, но я просто не могу понять, что я делаю неправильно.Кроме того, модель задания связана с моделью пользователя разработки, но кандидат не связан с моделью пользователя.Может ли это быть проблемой?Заранее спасибо.

Я попробовал массу вещей в моем контроллере кандидатов, но теперь я вернул его к тому, что было до того, как я связал модель кандидата с моделью задания, чтобы я мог начать все сначала.снова, как будто я только что запустил миграцию в AddJobToCandidate

candid_controller.rb

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

views /андидатам / new.html.erb

<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 %>

rout.rb

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

views / jobs / list.html.erb единственное представление, которое ссылается наандидаты / new.html / erb

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

Миграция кандидатов / ассоциаций вакансий

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

jobs_controller.rb (не думаю, что это необходимо, но я все равно включу)

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

Ошибка не отображается, но модель не обновляется.

Одна из вещей, которые я пробовал в действии candid_controller #create, была:

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

, и я получаю сообщение об ошибке: «неопределенный метод,« кандидаты »на nil: NilClass '

Еще одна вещь, которую я попробовал, - добавить эту строку в действие #create:

@job = Job.find(params[:id])

, и я получаю ошибку «Не могу найти работу без идентификатора»

1 Ответ

1 голос
/ 02 мая 2019

Когда вы приходите к кандидату # новый, вы просто отбрасываете идентификатор задания.Вы не включаете его в данные, представленные формой, которую нужно собрать в контроллере создания.

Если вы полностью отказались от маршрутов RESTful, самым быстрым решением было бы добавить это в форму:

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

Тем не менее, я настоятельно рекомендую вам взглянуть на маршруты RESTful и вложенные ресурсы.У вас беспорядок, когда идентификатор, переданный кандидату, # new - это идентификатор другой модели.Пока вы занимаетесь этим, возможно, вы захотите пересмотреть вопрос о принадлежности кандидата к работе, что произойдет, если кандидат заинтересован в нескольких работах?Они каждый раз создают новый профиль?На сайтах вакансий обычно есть Job, Candidate (или User / Profile), а затем JobApplication, который объединяет их.

...