在创建和保存嵌套资源的实例时遇到问题
Having issues creating and saving an instance of a nested resource
我 运行 遇到了创建和保存嵌套资源实例的问题,我一直无法弄清楚如何解决这个问题。我有一个用户和一个工作模型(用户 has_many 工作和工作 belongs_to 用户)。现有用户应该能够通过该帐户 post/create 工作。
在控制台@user.jobs.build / @user.jobs.create 执行正常。但是,在视图中,当我单击 "Post a Job" 并尝试提交相应的表单时,我收到以下错误(取决于我所做的更改):
当我使用 @user = User.find(params[:id]) 和 @job = @user.jobs.build(user_jobs_params), 错误是:
ActionController::ParameterMissing (param is missing or the value is empty:
当我将表单提交给 jobs#create with @user = User.find(params[:id]) and @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]]
当我使用@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]]
当我将表单提交给 jobs#create with @user = current_user and @job = @user.jobs.build(user_jobs_params) 设置我的表单<%= form_with(model: @user, :url => { :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]]
我绞尽脑汁试图理解为什么 user_id 是 nil/unable 在服务器日志中找到时,用户已加载到网站的每个页面上。对于使用 current_user 的情况尤其感到困惑,因为它是在我的会话助手中定义的,并且需要存在才能让用户登录)。我还尝试使用 @user = User.new 和 运行 将其添加到其他一些错误中,如果这是执行此操作的适当方法,我可以添加这些错误,但是,这似乎没有意义,因为我我不是要创建一个新用户 post,而是创建一个 belongs_to 现有用户的工作。
更新中:
作业控制器
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 工作和工作 belongs_to 用户)。现有用户应该能够通过该帐户 post/create 工作。
在控制台@user.jobs.build / @user.jobs.create 执行正常。但是,在视图中,当我单击 "Post a Job" 并尝试提交相应的表单时,我收到以下错误(取决于我所做的更改):
当我使用 @user = User.find(params[:id]) 和 @job = @user.jobs.build(user_jobs_params), 错误是:
ActionController::ParameterMissing (param is missing or the value is empty:
当我将表单提交给 jobs#create with @user = User.find(params[:id]) and @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]]
当我使用@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]]
当我将表单提交给 jobs#create with @user = current_user and @job = @user.jobs.build(user_jobs_params) 设置我的表单<%= form_with(model: @user, :url => { :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]]
我绞尽脑汁试图理解为什么 user_id 是 nil/unable 在服务器日志中找到时,用户已加载到网站的每个页面上。对于使用 current_user 的情况尤其感到困惑,因为它是在我的会话助手中定义的,并且需要存在才能让用户登录)。我还尝试使用 @user = User.new 和 运行 将其添加到其他一些错误中,如果这是执行此操作的适当方法,我可以添加这些错误,但是,这似乎没有意义,因为我我不是要创建一个新用户 post,而是创建一个 belongs_to 现有用户的工作。
更新中:
作业控制器
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'
由于您在 JobsController 而不是 UsersController 中,因此您需要使用 user_id 从参数(不是 id)中获取用户的 id。尝试使用...
@user = User.find(params[:user_id])
此外,您不应在新操作中传递参数...仅在创建操作期间传递它们。
在新动作中
@job = @user.jobs.build
在创建动作中
@job = @user.jobs.build(user_jobs_params)
我 运行 遇到了创建和保存嵌套资源实例的问题,我一直无法弄清楚如何解决这个问题。我有一个用户和一个工作模型(用户 has_many 工作和工作 belongs_to 用户)。现有用户应该能够通过该帐户 post/create 工作。
在控制台@user.jobs.build / @user.jobs.create 执行正常。但是,在视图中,当我单击 "Post a Job" 并尝试提交相应的表单时,我收到以下错误(取决于我所做的更改):
当我使用 @user = User.find(params[:id]) 和 @job = @user.jobs.build(user_jobs_params), 错误是:
ActionController::ParameterMissing (param is missing or the value is empty:
当我将表单提交给 jobs#create with @user = User.find(params[:id]) and @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]]
当我使用@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]]
当我将表单提交给 jobs#create with @user = current_user and @job = @user.jobs.build(user_jobs_params) 设置我的表单<%= form_with(model: @user, :url => { :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]]
我绞尽脑汁试图理解为什么 user_id 是 nil/unable 在服务器日志中找到时,用户已加载到网站的每个页面上。对于使用 current_user 的情况尤其感到困惑,因为它是在我的会话助手中定义的,并且需要存在才能让用户登录)。我还尝试使用 @user = User.new 和 运行 将其添加到其他一些错误中,如果这是执行此操作的适当方法,我可以添加这些错误,但是,这似乎没有意义,因为我我不是要创建一个新用户 post,而是创建一个 belongs_to 现有用户的工作。
更新中: 作业控制器
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 工作和工作 belongs_to 用户)。现有用户应该能够通过该帐户 post/create 工作。
在控制台@user.jobs.build / @user.jobs.create 执行正常。但是,在视图中,当我单击 "Post a Job" 并尝试提交相应的表单时,我收到以下错误(取决于我所做的更改):
当我使用 @user = User.find(params[:id]) 和 @job = @user.jobs.build(user_jobs_params), 错误是:
ActionController::ParameterMissing (param is missing or the value is empty:
当我将表单提交给 jobs#create with @user = User.find(params[:id]) and @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]]
当我使用@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]]
当我将表单提交给 jobs#create with @user = current_user and @job = @user.jobs.build(user_jobs_params) 设置我的表单<%= form_with(model: @user, :url => { :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]]
我绞尽脑汁试图理解为什么 user_id 是 nil/unable 在服务器日志中找到时,用户已加载到网站的每个页面上。对于使用 current_user 的情况尤其感到困惑,因为它是在我的会话助手中定义的,并且需要存在才能让用户登录)。我还尝试使用 @user = User.new 和 运行 将其添加到其他一些错误中,如果这是执行此操作的适当方法,我可以添加这些错误,但是,这似乎没有意义,因为我我不是要创建一个新用户 post,而是创建一个 belongs_to 现有用户的工作。
更新中: 作业控制器
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'
由于您在 JobsController 而不是 UsersController 中,因此您需要使用 user_id 从参数(不是 id)中获取用户的 id。尝试使用...
@user = User.find(params[:user_id])
此外,您不应在新操作中传递参数...仅在创建操作期间传递它们。
在新动作中
@job = @user.jobs.build
在创建动作中
@job = @user.jobs.build(user_jobs_params)