【发布时间】:2017-01-12 08:03:09
【问题描述】:
我有一个 Rails 应用程序,用户在其中创建了一个新工作,并且在 job/new _form 上,我让用户输入工作所属公司的信息。
数据库中的工作只是它的创建日期、创建它的用户,以及公司、联系人、工作站点等表的附加外键。
我的申请中的公司has_many 工作和工作belongs_to 公司。
所以,在我将 Job 持久化到数据库之前,我必须先保存新的 Company,然后我才能获取它的主键并将其放入 Jobs company_id 外键元组中。
我在 params 哈希中正确返回了所有内容,如下所示:
>> params
=> {"utf8"=>"✓", "authenticity_token"=>"NiQO7Wlq87h3+YM//yIEMnctVKectfmZBb74suFOCcmg7g4YyCmGo2OiciOd3VuRDR52tKoE0v9nq1LYoTqHOQ==", "job"=>{"date"=>"2016-09-04 16:06:49 -0700", "user_id"=>"1", "company_id"=>"", "subcontractor_id"=>"", "jobsite_id"=>"", "companies"=>{"name"=>"Test Company", "phone"=>"(530)111-2222", "street"=>"3177 testing st", "city"=>"cameron park", "state"=>"ca", "zip"=>"95682", "email"=>"testemail@mail.com", "website"=>"testcompany.com"}}, "commit"=>"Create Job", "controller"=>"jobs", "action"=>"create"}
>>
我可以通过params[:job][:companies]访问公司信息
所以我的理论是,在 Jobs 控制器中,在 def create 中,在调用 @job.save 之前,我必须先执行 @company.new(company_params) 和 @company.save 以便我可以保存公司,然后获取其主键从数据库。
但是我需要一点帮助。
有没有人可以给点建议?
编辑:
这是我的_form中的一个示例,
<%= f.fields_for @company do |company| %>
<div class="field">
<%= company.label :name %>
<%= company.text_field :name %>
</div>
在我拥有的作业控制器中,
def new
@job = Job.new
@company = Company.new
end
def create
@job = Job.new(job_params)
@company = Company.new(params[:job][:company])
Job.rb 有
accepts_nested_attributes_for :company
参数是:
def job_params
params.require(:job).permit(:date, :user_id, :company_id, :subcontractor_id, :jobsite_id, :company_attributes => [:name, :phone, :street, :city, :state, :zip, :email, :website])
end
当我提交表单时,属性返回为company 而不是company_attributes,所以它告诉我“Unpermitted parameter: company”。
我设置它的方式,@job 没有功能来做@job.company.build,它们不是这样嵌套的。公司就是一张桌子,一个公司可以有很多工作,一个工作能做的就是执行@job.company
这就是为什么我需要先创建公司,这样我才能得到它的主键,然后说@job.company_id = @company.id
我希望这能让事情更清楚。
【问题讨论】:
标签: ruby-on-rails model-view-controller nested-attributes params