参数不会传递给子类

时间:2018-02-07 18:11:02

标签: ruby-on-rails ruby ruby-on-rails-3

当我尝试创建工作时,它会显示"公司必须存在",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

作业/ _form

<%= 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_namecompany_id不会传递到views/jobs/_form

你能帮我解决一下吗?似乎创建动作有问题。我是Ruby的新手,请解释我如何解决这个问题。

1 个答案:

答案 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;