【问题标题】:Having issues creating and saving an instance of a nested resource在创建和保存嵌套资源的实例时遇到问题
【发布时间】:2018-07-05 17:30:28
【问题描述】:

我在创建和保存嵌套资源的实例时遇到了问题,但我不知道如何解决这个问题。我有一个用户和一个工作模型(用户 has_many 工作和工作属于用户)。现有用户应该能够通过该帐户发布/创建工作。

在控制台@user.jobs.build / @user.jobs.create 执行正常。但是,在视图中,当我单击“发布工作”并尝试提交相应的表单时,我收到以下错误(取决于我所做的更改):

  1. 当我使用@user = User.find(params[:id]) 和@job = @user.jobs.build(user_jobs_params) 将表单提交给jobs#new 时,错误是:

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

  2. 当我使用@user = User.find(params[:id]) 和@job = @user.jobs.build(user_jobs_params) 将表单提交给jobs#create 时,错误是:

    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) 将表单提交给jobs#create 时,错误是:

    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) 将表单提交给jobs#create 时,使用 { :controller => "job", :action => "create" }, :html => {:method => :post}) 做 |f| %>,错误是:

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

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

我一直在绞尽脑汁试图理解为什么在服务器日志中用户 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

我在创建和保存嵌套资源的实例时遇到了问题,但我不知道如何解决这个问题。我有一个用户和一个工作模型(用户 has_many 工作和工作属于用户)。现有用户应该能够通过该帐户发布/创建工作。

在控制台@user.jobs.build / @user.jobs.create 执行正常。但是,在视图中,当我单击“发布工作”并尝试提交相应的表单时,我收到以下错误(取决于我所做的更改):

  1. 当我使用@user = User.find(params[:id]) 和@job = @user.jobs.build(user_jobs_params) 将表单提交给jobs#new 时,错误是:

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

  2. 当我使用@user = User.find(params[:id]) 和@job = @user.jobs.build(user_jobs_params) 将表单提交给jobs#create 时,错误是:

    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) 将表单提交给jobs#create 时,错误是:

    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) 将表单提交给jobs#create 时,使用 { :controller => "job", :action => "create" }, :html => {:method => :post}) 做 |f| %>,错误是:

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

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

我一直在绞尽脑汁试图理解为什么在服务器日志中用户 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'

【问题讨论】:

  • “当我将表单提交给 jobs#new” - 这不是 new 的用途。它用于初始化资源并呈现表单。
  • "ActiveRecord::RecordNotFound (Couldn't find User with 'id'=)" - 很可能,您的params[:id]nil。你能显示rake routes 的结果吗?添加到问题。
  • "ActionController::ParameterMissing(参数丢失或值为空:" - user_job_params 包含什么?
  • 请发布create操作的控制器代码以及其中使用的所有之前的过滤器和方法。
  • @sovalina,视图位于视图 > 作业 > new.html.erb 中,并且在 form_for 中使用 user_jobs_path,因为这是一个嵌套资源。根据马特的以下建议,表格似乎可以通过,但在创建时,工作不会发布。我将更新创建操作,看看你们是否能明白原因

标签: ruby-on-rails ruby-on-rails-5 associations has-many belongs-to


【解决方案1】:

由于您在 JobsController 而不是 UsersController 中,因此您需要从参数中获取带有 user_id 的用户 id(不是 id)。尝试使用...

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

此外,您不应在新操作中传递参数...仅在创建操作期间传递它们。

在新动作中

@job = @user.jobs.build

在创建动作中

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

【讨论】:

  • :user_id 工作!但是,现在我在将记录保存到数据库时遇到问题 - 有一个回滚,它说创建是问题,创建操作如下所示: def create [at]user = User.find(params[:user_id]) [ at]job = [at]user.jobs.build(user_job_params) [at]job.save end 和 def user_job_params params.require(:job).permit(:job_name, :job_description 等...... ...)错误是在创建;我也试过 [at]user.jobs.create(user_job_params) 并且也有回滚失败。 No before 过滤器/对作业的操作。
  • 失败还显示:ActiveRecord::StatementInvalid (SQLite3::BusyException: 数据库被锁定:提交事务但我没有打开控制台或任何东西
  • 尝试在 Rails 控制台中运行 ActiveRecord::Base.connection.execute("BEGIN TRANSACTION; END;")
  • 如果这不起作用,请将您的日志输出发布到发生错误的原始问题(不在 cmets 中),以 Started POST 开头
  • 这样做并且仍然得到相同的响应提交事务 (2.3ms) 回滚事务在 5023ms 内完成 500 内部服务器错误 (ActiveRecord: 5015.4ms) ActiveRecord::StatementInvalid (SQLite3::BusyException: 数据库被锁定: 提交事务): app/controllers/jobs_controller.rb:28:in `create'
猜你喜欢
  • 2011-08-16
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 2016-03-02
  • 1970-01-01
  • 2021-04-07
相关资源
最近更新 更多