Проблемы с созданием и сохранением экземпляра вложенного ресурса - PullRequest
0 голосов
/ 05 июля 2018

У меня проблемы с созданием и сохранением экземпляра вложенного ресурса, и я не смог понять, как это исправить. У меня есть модель User и Jobs (пользователь has_many заданий и задание принадлежит_пользователю). Существующие пользователи должны иметь возможность размещать / создавать вакансии через свой аккаунт.

В консоли @ user.jobs.build / @ user.jobs.create выполните нормально. Однако в представлениях, когда я нажимаю «Опубликовать работу» и пытаюсь отправить соответствующую форму, я получаю следующие ошибки (в зависимости от того, что я изменяю):

  1. Когда я отправляю форму на вакансии # new с @user = User.find (params [: id]) и @job = @ user.jobs.build (user_jobs_params), ошибка:

    ActionController::ParameterMissing (param is missing or the value is empty:

  2. Когда я отправляю форму для заданий # create с @user = User.find (params [: id]) и @job = @ user.jobs.build (user_jobs_params), ошибка:

    ActiveRecord::RecordNotFound (Couldn't find User with 'id'=):

    SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", nil], ["LIMIT", 1]]

  3. Когда я отправляю форму на вакансии # создаю с @user = current_user и @job = @ user.jobs.build (user_jobs_params), ошибка:

    ActionController::ParameterMissing (param is missing or the value is empty:

    SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", nil], ["LIMIT", 1]]

  4. Когда я отправляю форму на работу, # создаю с помощью @user = current_user и @job = @ user.jobs.build (user_jobs_params), устанавливаю мою форму с помощью <% = form_with (model: @user,: url => {: controller => "job",: action => "create"},: html => {: method =>: post}) do | f | %>, ошибка:

    ActionController::ParameterMissing (param is missing or the value is empty:

    SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", nil], ["LIMIT", 1]]

Я ломал голову, пытаясь понять, почему user_id отсутствует или не может быть найден, когда в журнале сервера пользователь загружается на каждую страницу веб-сайта. Особенно запутано в случаях, когда используется current_user, так как он определен в моем хелпере сессий и должен существовать, чтобы пользователь мог войти в систему). Я также попытался сделать это с помощью @user = User.new и натолкнулся на некоторые другие ошибки, которые я могу добавить, если это подходящий способ сделать это, однако, это не имело смысла, так как я не пытаюсь создать новый пользователь с сообщениями о вакансиях, а скорее создайте работу, которая принадлежит существующему пользователю.

ОБНОВЛЕНИЕ: Контроллер заданий

def new
    @user = User.find(params[:user_id])
    @job = @user.jobss.build
  end

Пробное нажатие создало два разных способа и ни один не сработал!

  def create
    @user = User.find(params[:user_id])
    @job = @user.jobs.build(user_job_params)
    @job.save
  end

  def create
    @user = User.find(params[:user_id])
    @job = @user.jobs.create(user_job_params)
  end

  private

  def user_job_params
    params.require(:job).permit(:job_name, 
                              :job_description, :job_deadline, :organization,
                              :organization_liaison_name, :organization_liaison_email)
  end
end

Верхняя часть пользовательского контроллера

class User < ApplicationRecord
  has_one :partner_profile
  has_one :student_profile
  has_many :jobs, inverse_of: :user


  accepts_nested_attributes_for :student_profile, :partner_profile, update_only: true
  attr_accessor :remember_token, :activation_token, :reset_token
  before_save   :downcase_email
  before_create :create_activation_digest, :build_profile
  validates :first_name,  presence: true, length: { maximum: 50 }
  validates :last_name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                      format: { with: VALID_EMAIL_REGEX },
                      uniqueness: { case_sensitive: false }
  has_secure_password
  validates :password, presence: true, length: { minimum: 6 }, allow_nil: true
  validates :account_type, presence: true

У меня проблемы с созданием и сохранением экземпляра вложенного ресурса, и я не смог понять, как это исправить. У меня есть модель User и Jobs (пользователь has_many заданий и задание принадлежит_пользователю). Существующие пользователи должны иметь возможность размещать / создавать вакансии через свой аккаунт.

В консоли @ user.jobs.build / @ user.jobs.create выполните нормально. Однако в представлениях, когда я нажимаю «Опубликовать работу» и пытаюсь отправить соответствующую форму, я получаю следующие ошибки (в зависимости от того, что я изменяю):

  1. Когда я отправляю форму на вакансии # new с @user = User.find (params [: id]) и @job = @ user.jobs.build (user_jobs_params), ошибка:

    ActionController::ParameterMissing (param is missing or the value is empty:

  2. Когда я отправляю форму на вакансии # создаю с @user = User.find (params [: id]) и @job = @ user.jobs.build (user_jobs_params), ошибка:

    ActiveRecord::RecordNotFound (Couldn't find User with 'id'=):

    SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", nil], ["LIMIT", 1]]

  3. Когда я отправляю форму на вакансии # создаю с @user = current_user и @job = @ user.jobs.build (user_jobs_params), ошибка:

    ActionController::ParameterMissing (param is missing or the value is empty:

    SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", nil], ["LIMIT", 1]]

  4. Когда я отправляю форму на работу, # создаю с @user = current_user и @job = @ user.jobs.build (user_jobs_params), устанавливаю мою форму с помощью <% = form_with (model: @user,: url => {: controller => "job",: action => "create"},: html => {: method =>: post}) do | f | %>, ошибка:

    ActionController::ParameterMissing (param is missing or the value is empty:

    SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", nil], ["LIMIT", 1]]

Я ломал голову, пытаясь понять, почему user_id отсутствует или не может быть найден, когда в журнале сервера пользователь загружается на каждую страницу веб-сайта. Особенно запутано в случаях, когда используется current_user, так как он определен в моем хелпере сессий и должен существовать, чтобы пользователь мог войти в систему). Я также попытался сделать это с помощью @user = User.new и натолкнулся на некоторые другие ошибки, которые я могу добавить, если это подходящий способ сделать это, однако, это не имело смысла, так как я не пытаюсь создать новый пользователь с сообщениями о вакансиях, а скорее создайте работу, которая принадлежит существующему пользователю.

ОБНОВЛЕНИЕ: Контроллер заданий

def new
    @user = User.find(params[:user_id])
    @job = @user.jobss.build
  end

  def create
    @user = User.find(params[:user_id])
    @job = @user.jobs.build(user_job_params)
    @job.save
  end

  def create
    @user = User.find(params[:user_id])
    @job = @user.jobs.create(user_job_params)
  end

  private

  def user_job_params
    params.require(:job).permit(:job_name, 
                              :job_description, :job_deadline, :organization,
                              :organization_liaison_name, :organization_liaison_email)
  end
end

Верхняя часть пользовательского контроллера

class User < ApplicationRecord
  has_one :partner_profile
  has_one :student_profile
  has_many :jobs, inverse_of: :user


  accepts_nested_attributes_for :student_profile, :partner_profile, update_only: true
  attr_accessor :remember_token, :activation_token, :reset_token
  before_save   :downcase_email
  before_create :create_activation_digest, :build_profile
  validates :first_name,  presence: true, length: { maximum: 50 }
  validates :last_name,  presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                      format: { with: VALID_EMAIL_REGEX },
                      uniqueness: { case_sensitive: false }
  has_secure_password
  validates :password, presence: true, length: { minimum: 6 }, allow_nil: true
  validates :account_type, presence: true

ОШИБКА создания задания

Started POST "/users/2/jobs" for XXXX at 2018-07-05 19:42:33 +0000
Cannot render console from XXXX! Allowed networks: XXXX
Processing by JobsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"I1/okrk5p125FKrFx2Nhu4L78UNJFQIZPgjWfnzVnCCh5vzr9AuNxFkl2jHD+qjshlh170OI1o0Av8yGlek4Aw==", "job"=>{"job_name"=>"ega", "job_description"=>"", job_deadline(2i)"=>"", "job_deadline(3i)"=>"", "job_deadline(1i)"=>"", "organization"=>"", "organization_liaison_name"=>"", "organization_liaison_email"=>"", "program_manager_first_name"=>"", "program_manager_last_name"=>"", "program_manager_email"=>"", "program_manager_phone_number"=>""}, "commit"=>"Submit A New Job!", "user_id"=>"2"}
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
   (0.1ms)  begin transaction
  SQL (2.9ms)  INSERT INTO "jobs" ("user_id", job_name", "status", "job_description", "organization", "organization_liaison_name", "organization_liaison_email", "program_manager_first_name", "program_manager_last_name", "program_manager_email", "program_manager_phone_number", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)  [["user_id", 2], ["job_name", "ega"], ["status", "Pending Approval"], ["job_description", ""], ["organization", ""], ["organization_liaison_name", ""], ["organization_liaison_email", ""], ["program_manager_first_name", ""], ["program_manager_last_name", ""], ["program_manager_email", ""], ["program_manager_phone_number", ""], ["created_at", "2018-07-05 19:42:33.406656"], ["updated_at", "2018-07-05 19:42:33.406656"]]
   (5010.0ms)  commit transaction
   (2.3ms)  rollback transaction
Completed 500 Internal Server Error in 5023ms (ActiveRecord: 5015.4ms)



ActiveRecord::StatementInvalid (SQLite3::BusyException: database is locked: commit transaction):

app/controllers/jobs_controller.rb:28:in `create'

1 Ответ

0 голосов
/ 05 июля 2018

Поскольку вы работаете в JobsController, а не в UsersController, вам нужно получить идентификатор пользователя с помощью user_id из параметров (не id). Попробуйте использовать ...

@user = User.find(params[:user_id])

Кроме того, вы не должны передавать параметры в новом действии ... только передавайте их во время действия создания.

В новом действии

@job = @user.jobs.build

В действии создания

@job = @user.jobs.build(user_jobs_params)
...