0

У меня есть приложение rails, в котором пользователь создает новое задание, а на job/new _form у меня есть пользователь, который вводит информацию для Компании, в которой находится Иов.Rails - создать объект в базе данных из атрибутов вложенных параметров

Задание в базе данных просто дата она была создана, пользователь, который создал его, и через дополнительные внешние ключи к таблицам, как компании, Contact, на строительную площадку и т.д.

A Company has_many рабочих мест и вакансии belongs_to a Компания в моем заявлении.

Итак, прежде чем я смогу сохранить задание в базе данных, я должен сначала сохранить новую компанию, чтобы затем я смог ее первичным ключом перехватить и поместить ее в нужный внешний ключ для заданий 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"=>"[email protected]", "website"=>"testcompany.com"}}, "commit"=>"Create Job", "controller"=>"jobs", "action"=>"create"} 
>> 

И я могу получить доступ к информации о компании с params[:job][:companies]

Так что моя теория, в контроллере Работа в def create, прежде чем я позвоню @job.save, я должен сначала сделать @company.new(company_params) и @company.save, чтобы я мог сохранить компанию, а затем захватить ее первичный ключ из базы данных.

Но мне нужно немного помочь с этим.

Есть ли у кого-нибудь советы?

Edit:

Это пример из моего _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, так что это говорит мне «Самовольная параметр: компания.»

Способ, который у меня установлен, @job не выполняет функции @job.company.build, они не вложены таким образом. Компания является своим собственным столом и компания может иметь много рабочих мест, и все задания можно сделать, это выполнить @job.company

Именно поэтому мне нужно создать компанию первой, так что я могу получить его первичный ключ, а затем сказать @job.company_id = @company.id

Надеюсь, это упростит ситуацию.

ответ

0

Вы можете использовать nested_attributes_for :company или companies, глядя на ваш код и видя company_id, я предполагаю, что это company.

=>{ 
    ... 
    "job"=>{ 
    "date"=>"2016-09-04 16:06:49 -0700", 
    "user_id"=>"1", # <= Really shouldn't do this... 
    "company_attributes"=>{ 
     "name"=>"Test Company", 
     "phone"=>"(530)111-2222", 
     "street"=>"3177 testing st", 
     "city"=>"cameron park", 
     "state"=>"ca", "zip"=>"95682", 
     "email"=>"[email protected]", 
     "website"=>"testcompany.com" 
    } 
    }, 
    ... 
} 

Тогда в вашем разрешенном Params вы можете сделать что-то вроде:

def job_params 
    params.require(:job).permit(:date, :company_id, :subcontractor_id, :company_attributes => [:name, :phone, :street, :city, :state, :email, :website]) 
end 

Вы можете использовать fields_for :company в вашем form_tag. Также добавьте пустую компанию в новое действие.

def new 
    @job = Job.new 
    @job.build_company 
end 

EDIT

Вы не можете использовать @company на feilds_for как это.

Возможно fields_for :company, @company, но не только @company.

<%= f.fields_for :company do |company| %> 

Вы должны использовать символ для представления имени записи.

В противном случае имя поля будет "job[company]" или в вашем случае "job[companies]" вместо "job[company_attributes]".

И в любом случае вы можете просто добавить новые объекты в ассоциацию нового задания вместо добавления переменной экземпляра.

@job.build_company 

Вы можете попробовать его с этой рабочей репо: https://www.github.com/frank184/surveysays

И для справки: http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for

+0

Я использую fields_for в form_tag, но это будет только оказывать поля, если Я использую «fields_for: компании». Всюду, где я использую «nested_attributes_for: company» и «.permit (..., company_attributes [...])» Так что в диспетчере заданий он кричит на меня, говоря «Неопределенный параметр: компании» и i не знаю, как исправить эту проблему, которая, похоже, исходит из form_tag –

+0

@CodyPritchard, разместите свою форму, действие вашего контроллера и разрешенные параметры. Ваша проблема заключается в отправке '' компании ': {...} 'в ваших параметрах вместо' 'company_attributes": {...} '. Причина, по которой эти поля не отображались, заключается в том, что вам нужно отправить новую компанию с новым заданием (т. Е. '@ Job.company.build'). – fbelanger

+0

обновлено сообщение –

Смежные вопросы