当我尝试创建工作时,它会显示"公司必须存在",c_name和company_id不会传递views/jobs/_form
class CreateJobs < ActiveRecord::Migration[5.1]
def change
create_table :jobs do |t|
t.string :title
t.text :description
t.string :c_name
t.integer :user_id
t.integer :company_id
t.timestamps
end
end
end
class CreateCompanies < ActiveRecord::Migration[5.1]
def change
create_table :companies do |t|
t.string :c_name
t.text :c_description
t.integer :user_id
t.timestamps
end
end
end
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :companies
has_many :jobs
end
class Job < ApplicationRecord
belongs_to :user
belongs_to :category
belongs_to :company
end
class Company < ApplicationRecord
belongs_to:user
has_many:jobs
end
def show
end
def new
@job = current_user.jobs.build
end
def create
job_attrs = jobs_params.except(:c_name)
job_attrs[:c_name] = Company.find_by(id: jobs_params[:c_name])
@job = current_user.jobs.build(job_attrs)
if @job.save
flash[:success]= "success"
redirect_to @job
else
flash[:error]=@job.errors.full_messages
render "new"
end
end
def jobs_params
params
.require(:job)
.permit(:title,
:description,
:c_name,
:category_id,
:image,
:jobclosedate,
:company_id)
end
<%= simple_form_for(@job,validation:true ,html: { mutlipart: true, class: 'form-horizontal'}) do |f| %>
<%= f.input :title, label: "Job Title", input_html: { class: "form-control"} %>
<%= f.input :description, label: "Job Description", input_html: { class: "form-control" } %>
<%= f.input :c_name, label: "Your Company", input_html: { class: "form-control" } %>
<%= f.collection_select :category_id, Category.all, :id, :name, {promt: "Choose a category" } %>
当我尝试创建一份工作时,它将返回一个&#34;公司必须存在&#34;验证错误,c_name
和company_id
不会传递到views/jobs/_form
。
答案 0 :(得分:1)
我看到你不是从一个选择中挑选一家公司,而只是写下这个名字。在你的控制器中,你正在寻找公司,名字。这种方法不是很好,因为用户可以写出不存在的公司名称或拼写错误。您可以使用select标记并传递company_id。
正确的做法是:
<强>迁移强>
class CreateJobs < ActiveRecord::Migration[5.1]
def change
create_table :jobs do |t|
t.string :title
t.text :description
#t.string :c_name REMOVE THIS. YOU DON'T NEED THE COMPANY NAME HERE.
t.integer :user_id
t.integer :company_id
t.timestamps
end
end
end
class CreateCompanies < ActiveRecord::Migration[5.1]
def change
create_table :companies do |t|
t.string :c_name
t.text :c_description
t.integer :user_id
t.timestamps
end
end
end
<强>模型强>
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :companies
has_many :jobs
end
class Job < ApplicationRecord
belongs_to :user
belongs_to :category
belongs_to :company
end
class Company < ApplicationRecord
belongs_to:user
has_many:jobs
end
职位控制器
def new
@job = current_user.jobs.build
end
def create
@job = current_user.jobs.build(job_params)
if @job.save
flash[:success]= "success"
redirect_to @job
else
flash[:error]=@job.errors.full_messages
render "new"
end
end
def jobs_params
params.require(:job).permit(:title,
:description,
:category_id,
:image,
:jobclosedate,
:company_id)
end
<强>作业/ _form 强>
<%= simple_form_for(@job,validation:true ,html: { multipart: true, class: 'form-horizontal'}) do |f| %>
<%= f.input :title, label: "Job Title", input_html: { class: "form-control"} %>
<%= f.input :description, label: "Job Description", input_html: { class: "form-control" } %>
<!-- Removed the c_name field -->
<%= f.collection_select :category_id, Category.all, :id, :name, { prompt: "Choose a category" } %>
<%= f.collection_select :company_id, current_user.companies.all, :id, :name, {prompt: "Choose a company" } %>
<% end %>
注意:您的工作属于用户。它也属于一家公司。一家公司属于一个用户。因此可能不需要作业中的用户(您可以通过job.company.user访问(除非job.user表示其他概念,它与公司用户不同)
以前的方法
无论如何,如果你想在视图中继续使用公司名称,你必须在控制器中进行更改。您用于按名称搜索公司的代码是错误的。你需要让company_id放入params(以及作业记录中),但你只是添加整个公司记录。
而不是
job_attrs[:c_name] = Company.find_by(id: jobs_params[:c_name])
你应该写
company = current_user.companies.find_by(name: jobs_params[:c_name])
if company
job_attrs[:company_id] = company.id
else
# Error. Do not create job...
end
最后,您不需要在Job表中使用公司名称(只需删除c_name)。如果您仍想在视图中使用c_name来获取公司,只需在模型中定义一个属性(但不要将其保存在表中)。
attr_accessor :c_name;